使用PyCharm配合部署Python的Django框架的配置纪实


Posted in Python onNovember 19, 2015

安装软件
安装 Python 2.7、PyCharm、pip(Python包管理工具)、Django ( pip install Django)

部署
PyCharm 新建Django工程

使用PyCharm配合部署Python的Django框架的配置纪实

完成后,其目录如下:

使用PyCharm配合部署Python的Django框架的配置纪实

子目录MyDjangoProject下表示工程的全局配置,分别为setttings.py、urls.py和wsgi.py,其中setttings.py包括了系统的数据库配置、应用配置和其他配置,urls.py则
表示web工程Url映射的配置。
子目录student则是在该工程下创建的app,包含了models.py、tests.py和views.py等文件
templates目录则为模板文件的目录
manage.py是Django提供的一个管理工具,可以同步数据库等等
 
启动
创建完成后,就可以正常启动了。点击Run 按钮,启动时报错了:

Traceback (most recent call last):
 File "D:/workspace/MyDjangoProject/manage.py", line 10, in <module>
  execute_from_command_line(sys.argv)
 File "D:\Python27\lib\site-packages\django\core\management\__init__.py", line 338, in execute_from_command_line
  utility.execute()
 File "D:\Python27\lib\site-packages\django\core\management\__init__.py", line 312, in execute
  django.setup()
 File "D:\Python27\lib\site-packages\django\__init__.py", line 18, in setup
  apps.populate(settings.INSTALLED_APPS)
 File "D:\Python27\lib\site-packages\django\apps\registry.py", line 89, in populate
  "duplicates: %s" % app_config.label)
django.core.exceptions.ImproperlyConfigured: Application labels aren't unique, duplicates: admin

应该是admin配置冲突了,打开setttings.py文件,发现admin配置重复了

INSTALLED_APPS = (
  'django.contrib.admin',
  'django.contrib.auth',
  'django.contrib.contenttypes',
  'django.contrib.sessions',
  'django.contrib.messages',
  'django.contrib.staticfiles',
  'django.contrib.admin',
  'student',
)
注释掉其中一行后(为什么会有这个问题,估计是个bug),重新启动,ok

使用PyCharm配合部署Python的Django框架的配置纪实

web工程添加页面
 
此时,我们尚没有写一行代码,程序就duang跑起来了! 快添加一个Hello World的页面吧。
 
打开student/views.py文件,输入以下内容

def sayHello(request):
  s = 'Hello World!'
  current_time = datetime.datetime.now()
  html = '<html><head></head><body><h1> %s </h1><p> %s </p></body></html>' % (s, current_time)
  return HttpResponse(html)
打开url.py文件,需要进行url映射的配置:
url(r'^student/', sayHello)

当用户输入http://**/student 时,便会调用sayHello方法,该方法通过HttpResponse()将页面内容作为响应返回。
 
重启服务,访问http://localhost:8000/student/

使用PyCharm配合部署Python的Django框架的配置纪实

在views.py页面可以将页面需要的元素通过字符串的形式,调用HttpResponse()类作为响应返回到浏览器。但这样,页面逻辑和页面混合在一起,手写起来很繁琐,工作量比较大。如果我们需要展示一些动态的数据,而页面基本不改变的情况下,该怎么做呢?
比如在用户访问 http://localhost:8000/student/ 时,我们想动态展示一些学生的数据。可以这样做:
首先在templates目录下,新建 student.html文件,该文件作为模板,内容如下:

<!DOCTYPE html>
<html>
<head>
  <title></title>
</head>
<body>
  <ul>
    {% for student in students %}
    <li>
      id:{{ student.id }},姓名:{{ student.name }},age: {{ student.age }}
    </li>
    {% endfor %}
  </ul>
</body>
</html>

修改 views.py文件,添加方法showStudents()

def showStudents(request):
  list = [{id: 1, 'name': 'Jack'}, {id: 2, 'name': 'Rose'}]
  return render_to_response('student.html',{'students': list})

该方法将list作为动态数据,通过render_to_response方法绑定到模板页面student.html上。
 
添加url映射,url(r'^showStudents/$', showStudents)
修改settings.py模板配置:'DIRS': [BASE_DIR+r'\templates'],
 
重启服务,访问http://localhost:8000/showStudents,出现:

使用PyCharm配合部署Python的Django框架的配置纪实

至此,我们已可以正常将一些“动态”数据绑定到模板上了。但是怎么样访问数据库呢?
从数据库获取需要的数据,展示在页面上?
 
首先需要安装数据库驱动啦,即mysql_python,
 接着配置数据库连接:

DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': 'student',
    'USER': 'root',
    'PASSWORD': '1234',
    'HOST': '127.0.0.1',
    'PORT': '3306',
    #'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
  }
}

配置完成之后,需要检测数据库配置是否正确,使用 manage.py shell命令,进入shell交互界面:
输入:

from django.db import connection
cursor = connection.cursor()

 
如果不报错,说明配置正确。
创建model,打开models.py,定义model如下:

class Student(models.Model)
  id = models.BigIntegerField
  name = models.CharField(max_length=20, default='a')

 
然后调用 manage.py syncdb
正常情况下,该步骤做完之后,model 会和数据库保持一致性。但是在测试中,命令执行成功后,却发现数据库并没有建立该表。
对于该种情况,做如下操作即可正常:
(1)注释掉models.py文件代码,执行 manage.py makemigerations student
【和manage.py migerate --fake】
(2)打开注释,执行【 manage.py makemigerations student和 】manage.py migerate命令
通过以上两步,便可正常操作了
 
views.py中添加方法:showRealStudents
   

def showRealStudents(request):
  list = Student.objects.all()
  return render_to_response('student.html', {'students': list})

urls.py添加映射 url(r'^showRealStudents/$', showRealStudents)
 
重启服务,打开连接:http://localhost:8000/showRealStudents
页面输出正常。
至此,使用Django,可以正常操作数据库,自定义模板,在页面展示数据了。

服务器
由于Django自带轻量级的server,因此默认使用该server,但实际生产中是不允许这么干的,生产环境中通常使用Apache Httpd Server结合mod_wsgi.so来做后端服务器。
 
以下部署环境为:Python2.7.6
1、安装httpd-2.2.25-win32-x86-no_ssl.msi
2、将下载好的mod_wsgi.so 放在 D:\Program Files\Apache Software Foundation\Apache2.2\modules 模块下。
3、在新建的web工程 MyDjangoProject目录下新建 django.wsgi文件
内容如下(相应的目录需要修改):

import os
import sys
 
djangopath = "D:/Python27/Lib/site-packages/django/bin"
if djangopath not in sys.path:
  sys.path.append(djangopath)
 
projectpath = 'D:/workspace/MyDjangoProject'
if projectpath not in sys.path:
  sys.path.append(projectpath)
 
apppath = 'D:/workspace/MyDjangoProject/MyDjangoProject'
if apppath not in sys.path:
  sys.path.append(apppath)
os.environ['DJANGO_SETTINGS_MODULE']='MyDjangoProject.settings'
 
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

4、修改httpd.conf ,添加如下:

LoadModule wsgi_module modules/mod_wsgi.so
WSGIScriptAlias / "D:/workspace/MyDjangoProject/django.wsgi"
<Directory "D:/workspace/MyDjangoProject/">
  Options FollowSymLinks
  AllowOverride None
  Order deny,allow
  Allow from all
</Directory>

ok,重启server,页面正常了。
在部署的过程中,遇到一个异常,如下:
The translation infrastructure cannot be initialized before the apps registry is ready
原因是django.wsgi一开始按照较为古老的写法,改为新版本的写法就Ok了。

Python 相关文章推荐
python追加元素到列表的方法
Jul 28 Python
python中闭包Closure函数作为返回值的方法示例
Dec 17 Python
Python使用matplotlib绘制正弦和余弦曲线的方法示例
Jan 06 Python
python 2.7.14安装图文教程
Apr 08 Python
基于python绘制科赫雪花
Jun 22 Python
如何在python字符串中输入纯粹的{}
Aug 22 Python
Django项目后台不挂断运行的方法
Aug 31 Python
Python3使用xml.dom.minidom和xml.etree模块儿解析xml文件封装函数的方法
Sep 23 Python
Python 利用邮件系统完成远程控制电脑的实现(关机、重启等)
Nov 19 Python
wxpython自定义下拉列表框过程图解
Feb 14 Python
keras 模型参数,模型保存,中间结果输出操作
Jul 06 Python
Python使用xlrd实现读取合并单元格
Jul 09 Python
详解在Python程序中解析并修改XML内容的方法
Nov 16 #Python
Python通过DOM和SAX方式解析XML的应用实例分享
Nov 16 #Python
Python的Flask开发框架简单上手笔记
Nov 16 #Python
python实现mysql的单引号字符串过滤方法
Nov 14 #Python
浅析Python中signal包的使用
Nov 13 #Python
Python下rrdtool模块的基本使用方法
Nov 13 #Python
简单了解Python下用于监视文件系统的pyinotify包
Nov 13 #Python
You might like
frename PHP 灵活文件命名函数 frename
2009/09/09 PHP
Eclipse中php插件安装及Xdebug配置的使用详解
2013/04/25 PHP
CodeIgniter错误mysql_connect(): No such file or directory解决方法
2014/09/06 PHP
PHP实现页面静态化深入讲解
2021/03/04 PHP
javascript prototype,executing,context,closure
2008/12/24 Javascript
CSS(js)限制页面显示的文本字符长度
2012/12/27 Javascript
使用javascript:将其它类型值转换成布尔类型值的解决方法详解
2013/05/07 Javascript
jQuery制作简单柱状图实例
2015/01/28 Javascript
JavaScript实现自动弹出窗口并自动关闭窗口的方法
2015/08/06 Javascript
jquery表单验证插件formValidator使用方法
2016/04/01 Javascript
关于JavaScript中forEach和each用法浅析
2017/07/27 Javascript
Bootstrap + AngularJS 实现简单的数据过滤字符查找功能
2017/07/27 Javascript
前端把html表格生成为excel表格的实例
2017/09/19 Javascript
js 原生判断内容区域是否滚动到底部的实例代码
2017/11/15 Javascript
基于JavaScript实现表格滚动分页
2017/11/22 Javascript
微信小程序实现页面跳转传值以及获取值的方法分析
2017/12/18 Javascript
vue toggle做一个点击切换class(实例讲解)
2018/03/13 Javascript
推荐一个基于Node.js的表单验证库
2019/02/15 Javascript
node之本地服务器图片上传的方法示例
2019/03/26 Javascript
js简单的分页器插件代码实例
2019/09/11 Javascript
layui switch 开关监听 弹出确定状态转换的例子
2019/09/21 Javascript
Python sys.path详细介绍
2013/10/17 Python
在Python中使用成员运算符的示例
2015/05/13 Python
Python下的常用下载安装工具pip的安装方法
2015/11/13 Python
基于numpy中数组元素的切片复制方法
2018/11/15 Python
python按比例随机切分数据的实现
2019/07/11 Python
PyCharm2020.3.2安装超详细教程
2021/02/08 Python
深入理解css属性的选择对动画性能的影响
2016/04/20 HTML / CSS
KIKO MILANO荷兰网上商店:意大利专业化妆品品牌
2017/05/12 全球购物
凯伦·米莲女装网上商店:Karen Millen
2017/11/07 全球购物
Elizabeth Gage官网:英国最好的珠宝设计之一
2020/09/26 全球购物
什么是java序列化,如何实现java序列化
2012/11/14 面试题
小学生十佳少年事迹材料
2014/08/20 职场文书
幼儿园2015年度工作总结
2015/04/01 职场文书
JS新手入门数组处理的实用方法汇总
2021/04/07 Javascript
Requests什么的通通爬不了的Python超强反爬虫方案!
2021/05/20 Python