简介:许多朋友问有关如何写djangowsgi.py的问题。本文的首席CTO笔记将为您提供详细的答案,以供所有人参考。我希望这对每个人都会有所帮助!让我们一起看看!
本文演示了如何使用1.7的Django版本创建一个简单的Django网站。
1.创建项目
运行以下命令来创建Django项目。项目名称是MySite:
$ django- addmin.py startproject mysite
创建的项目目录如下:
我的网站
e- manage.py
t - 锰矿
t- __init__.py
在──设置.py
s-或urls.py
。─— wsgi.py
1个目录,5个文件
阐明:
__init__.py:让Python将目录作为开发包所需的文件(即一组模块)。这是一个空文件,通常您不需要修改它。
Manage.py:命令行工具允许您通过多种方式与Django项目进行交互。类型python manage.py帮助查看它可以做什么。您不需要编辑此文件;在此目录中为方便起见是纯粹的。
settings.py:Django项目的设置或配置。
urls.py:项目的URL路由设置。目前,它是空的。
wsgi.py:wsgi Web应用程序服务器配置文件。有关更多详细信息,请检查如何使用WSGI部署
接下来,您可以修改settings.py文件,例如:修改Lagansy_code,设置时区time_zone
来自django.core.urlresolvers import reververs_lazy
来自django.shortcuts导入重定向,get_object_or_404
来自django.forms.models导入modelform_factory
来自django.apps导入应用程序
从django.views.gneric.base导入templateresmixin,查看,查看
来自django.views.gneric.list导入listView
来自django.views.gneric.edit import createview,updateView,deleteview
从括号中。视图导入登录MIXIN,许可Mixin
从牙套中。
从。模型导入课程,模块,内容
来自.forms导入模块Formset
从django.db.models进口计数
来自.models导入主题
来自django.views.gneric.detail导入详细信息
来自学生。Forms导入课程enrollolform
#在这里创建您的观点。
class ownermixin(对象):
def get_queryset(self):
qs = super(superermixin,self).get_queryset()
返回QS.Filter(所有者= seld.request.user)
class eslowNitMixin(对象):
def form_valid(self,form):
form.instance.owner = self.request.user
返回super(outereditmixin,self).form_valid(form)
class ownerCoursemixin(ownermixin,loginrequiredmixin):
模型=课程
fields = ['主题','title','slug','概述']
success_url = reverse_lazy('manage_course_list')
class ownercourseeditminxin(ownererCoursemixin,eslowitMixin):
fields = ['主题','title','slug','概述']
success_url = reverse_lazy('manage_course_list')
template_name ='courses/manage/course/form.html'
类ManageCourSelistView(OholderCoursemixin,ListView):
template_name ='courses/manage/course/list.html'
班级CourseCreateaTeview(许可证
ownercourseeditminxin,
CreateView:
许可证='courses.add_course'
课程UpdateView(许可证
ownercourseeditminxin,
UpdateView:
cermission_required ='courses.change_course'
COURSELETEVIEW班级(许可证
ownercoursemixin,
Deleteview:
template_name ='courses/manage/course/delete.html'
success_url = reverse_lazy('manage_course_list')
cermission_required ='courses.delete_course'
coursemoduleupdateview(templateresponsemixin,查看):
template_name ='courses/manage/module/formset.html'
课程=无
def get_formset(seld,data = none):
返回moduleformset(instance = self.course,
数据=数据)
DEF调度(自我,请求,PK):
self.course = get_object_or_404(课程,id = pk,所有者= request.user)
返回超级(coursemoduleupdateview,self).dispatch(请求,PK)
def获取(自我,请求,*args,** kwargs):
formSet = self.get_formset()
返回selder_to_response({'course':self.course,
'FormSet':FormSet})
def post(self,request,*args,** kwargs):
formSet = self.get_formset(data = request.post)
如果formset.is_valid():
formSet.save()
返回redirect('manage_course_list')
返回selder_to_response({'course':self.course,
'FormSet':FormSet})
类ContentCreateupDateView(Templateresponsemixin,查看):
模块=无
模型=无
obj =无
template_name ='courses/manage/content/form.html'
def get_model(self,model_name):
如果在['text',''视频','image','file'中中的model_name]:
返回apps.get_model(app_label ='courses',
model_name = model_name)
没有返回
def get_form(self,model,*args,** kwargs):
form = modelm_factory(model,dubl = ['所有者',,
'命令',
“创建”,
'更新'])
返回表格(*args,** kwargs)
def dispatch(self,request,module_id,model_name,id = none):
self.module = get_object_or_404(模块,
id = module_id,
cousse __owner = request.user)
self.model = self.get_model(model_name)
如果ID:
self.obj = get_object_or_404(self.model,id = id = id,所有者= request.user)
返回super(contentCreateupDateView,self).dispatch(请求,module_id,model_name,id)
def get(self,request,module_id,model_name,id = none):
form = self.get_form(self.model,instance = self.obj)
返回self.render_to_response({'form':form,'object':self.obj})
def post(self,request,module_id,model_name,id = none):
form = self.get_form(self.model,
实例= self.obj,
data = request.post,
文件= request.files)
如果form.is_valid():
obj = form.save(commit = false)
obj.owner = request.user
obj.save()
打印ID,''
如果不是ID:
打印 '******************
content.objects.create(模块= seld.module,
项目= OBJ)
打印 '******************
返回redirect('module_content_list',self.module.id)
返回self.render_to_response({'form':form,'object':self.obj})
类ContentDeleteview(视图):
DEF帖子(自我,请求,ID):
content = get_object_or_404(内容,内容,
id = id,
模块__course__owner = request.user)
模块= content.module
content.item.delete()
content.delete()
返回redirect('module_content_list',module.id)
类ModulecontentListView(Templateresponsemixin,查看):
template_name ='courses/manage/module/content_list.html'
def get(self,request,module_id):
模块= get_object_or_404(模块,
id = module_id,
cousse __owner = request.user)
返回selder_to_response({'module':module})
类ModuleDorderView(CSRFEXEMPTMIXIN,
jsonrequestresponsemixin,
看法:
def post(自我,请求):
对于ID,请在self.request_json.items()中订购:
module.objects.filter(id = id,
course__owner = request.user).update(订单=订单)
返回self.render_json_response({'saved':'ok'})
类ContentOrderView(CSRFExemptMixin,
jsonrequestresponsemixin,
看法:
def post(自我,请求):
对于ID,请在self.request_json.items()中订购:
content.objects.filter(id = id,
模块__course__owner = request.user)
.update(订单=订单)
返回self.render_json_response({'saved':'ok'})
COURSSELISTVIEW(Templateresponsemixin,查看):
模型=课程
template_name ='courses/course/list.html'
def get(seld,请求,主题=无):
主题= object.objects.annotate
total_courtes = count('课程')
治愈
课程= course.objects.annotate(
total_modules = count('模块')
治愈
如果主题:
主题= get_object_or_404(主题,slug =主题)
课程=课程.filter(主题=主题)
打印“ ************”,主题,课程,主题
返回self.render_to_response({'subjets':主题,
“主题”:主题,
“课程”:课程})
coper coursedetailview(详细信息):
模型=课程
template_name ='课程/课程/详细信息html'
def get_context_data(self,** kwargs):
context = super(coursedetailview,
self).get_context_data(** kwargs)
context ['enroll_form'] = courseenrollform(
初始= {'course':self.Object})
返回上下文
安装软件
安装Python 2.7,Pycharm,PIP(Python软件包管理工具),Django(pip install django)
部署
Pycharm新Django项目
完成后,目录如下:
sub -directory medjangoproject指示该项目的全局配置,即setttings.py,urls.py和wsgi.py.其中,setttings.py包括系统数据库配置,应用程序配置和其他配置,以及urls.py是
指示Web工程URL映射的配置。
子目录学生是在项目下创建的一个应用程序,包括models.py,tests.py,views.py和其他文件
模板目录是模板文件的目录
Manage.py是Django提供的管理工具。
启动
创建完成后,可以正常启动。单击运行按钮以开始时机错误:
Trackback(最近的最新电话):
文件“ d:/workspace/mydjangoproject/manage.py”,第10行,在模块中
execute_from_command_line(sys.argv)
文件“ d:python27libsite-packagesdjangocooranagements__init__。py”,第338行,在execute_from_commman_line中
utility.execute()
文件“ d:python27libsite-packagesdjangocoranagements __init __. py”,第312行,在执行中
django.setup()
文件“ d:python27libsite-packagesdjango__init __. py”,第18行,在设置中
apps.populate(settings.installed_apps)
文件“ d:python27libsite-packagesdjangoapps egistry.py”,第89行,人口
“重复:%s”%app_config.label)
django.core.exceptions.improperlyconfigured:应用程序标签不是唯一的,重复:admin
它应该是配置冲突,打开settings.py文件,并发现重复管理员配置
instasted_apps =((
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.admin',
'学生',
治愈
评论丢失后(为什么有这个问题,估计它是一个错误),重新启动,确定
Web项目添加页面
目前,我们尚未编写一行代码,并且程序正在运行!添加一个Hello World页面。
打开学生/views.py文件,输入以下内容
def sayhello(请求):
S ='Hello World!'
current_time = dateTime.dateTime.now()
html ='htmlhead/headbody1%s/h1p%s/p/p/p/html'%(s,current_time)
返回httpresponse(HTML)
打开url.py文件,您需要配置URL映射:
url(r'^student/',sayhello)
当用户输入http:// **/站立时,调用了Sayhello方法。此方法通过httpresponse()返回页面内容作为响应。
重新启动服务,访问
在views.py页面上,该页面所需的元素需要调用httpresponse()类作为对浏览器的响应。相对较大。如果我们需要显示一些动态数据并且页面基本不更改,该怎么办?
例如,当用户面试时,我们想动态显示一些学生的数据。您可以做到这一点:
首先,在模板目录中,创建一个新的sut剂节.html文件。该文件用作模板。内容如下:
呢Doctype HTML
html
头
标题/标题
/头
身体
Ul
{学生中的学生%}
李
id:{student.id}},名称:{{student.name}},年龄:{{student.age}}
/li
{%endfor%}
/ul
/身体
/html
修改views.py文件,添加方法showstuders()
Def ShowStudents(请求):
list = [{id:1,'name':'jack'},{id:2,'name':'rose'}]
返回render_to_response('Student.html',{'sustemans':list})
该方法将列表用作动态数据,并将其绑定在render_to_response方法上与模板页面sutper.html。
添加URL映射,URL(R'^ShowStudents/$',ShowStudents)
修改设置.py模板配置:'dirs':[base_dir+r'emplates'],
重新启动服务,访问,出现:
在这一点上,我们通常可以将一些“动态”数据绑定到模板。但是如何访问数据库?
从数据库中获取所需的数据,在页面上显示它?
首先,您需要安装数据库驱动程序,即mysql_python,
然后配置数据库连接:
数据库= {
'默认': {
'引擎':'django.db.backends.mysql',
“名字”:“学生”,
“用户”:“根”,
'密码':'1234',
“主机”:'127.0.0.1',
'端口':'3306',
#'name':os.path.join(base_dir,'db.sqlite3'),
}
}
配置完成后,您需要检测数据库配置是否正确。使用Manage.py Shell命令输入Shell Interactive接口:
进入:
来自django.db导入连接
光标= Connection.Cursor()
如果您不报告错误,则配置是正确的。
创建一个模型,打开Models.py,然后定义模型如下:
班级学生(型号。模型)
id = models.bigintegerfield
name = models.charfield(max_length = 20,默认值='a')
然后致电manage.py syncdb
在正常情况下,完成此步骤后,模型将与数据库一致。但是,在测试中,在成功执行命令后,发现未建立数据库。
对于这种情况,请执行以下操作是正常的:
(1)评论型号。文件代码,执行管理。
[并管理。
(2)打开注释并执行[manage.py makemurations Student and] manage.py迁移命令
通过以上两个步骤,可以正常操作
如何添加views.py:showrealstudents
DEF SHOWREALSTUDENTS(请求):
list = student.objects.all()
返回render_to_response('Student.html',{'sustemans':list})
urls.py添加映射URL(r'^showrealstudents/$',showrealstudents)
重新启动服务并打开连接:
页面输出是正常的。
此时,使用Django可以正常操作数据库,自定义模板并在页面上显示数据。
服务器
由于Django配备了轻型服务器,因此默认使用服务器,但在实际生产中不允许这样做。在生产环境中,Apache HTTPD服务器与MOD_WSGI.SO相结合,作为后端服务器。
以下部署环境是:Python2.7.6
1.安装HTTPD-2.2.25-WIN32-X86-NO_SSL.MSI
2.将下载的mod_wsgi.so放置在D:Program filesapache软件Foundationapache2.2Modules模块。
3.在新建的Web项目中
内容如下(需要修改相应的目录):
导入操作系统
导入系统
djangopath =“ d:/python27/lib/site-ackages/django/bin”
如果djangopath不在sys.path中:
sys.path.append(djangopath)
ProjectPath ='d:/workspace/mydjangoproject'
如果项目路径不在sys.path中:
sys.path.append(Project Path)
apppath ='d:/workspace/mydjangoproject/mydjangoproject'
如果AppPath不在sys.path中:
sys.path.append(apppath)
os.environ ['django_settings_module'] ='mydjangoproject.settings''
来自django.core.wsgi import_wsgi_application
应用程序= get_wsgi_application()
4.修改httpd.conf,添加如下:
loadModule wsgi_module模块/mod_wsgi.so
wsgiscriptalias/“ d:/workspace/mydjangoproject/django.wsgi”
目录“ d:/workspace/mydjangoproject/“”
选项跟随Symlinks
Allowoverride无
命令拒绝,允许
从所有人那里允许
/目录
好的,重新启动服务器,页面是正常的。
在部署过程中,遇到一个例外,如下:
在应用程序注册表准备之前,在应用程序注册表之前初始化翻译插管
原因是django.wsgi从旧写作开始,可以写入新版本。
句子:安装必要的工具1.部署Python头发环境的PIP安装,以简化某些软件安装程序(PIP响应lualuarocks)Sudo apt-get安装安装python-pip安装三个python框架sudo pip sudo sudo sudo sudo sudo安装django ==一个。5。一个sudo pip安装龙卷风== 3.3。一二。安装运行Pythonwsgi HTTP服务SUDO PIP安装gunicorn 3. Virtualenv,安装和部署Sudo Pip intern virtualenv:create exployment application.debug“:true,true,” static_path“:”### urls = [(r“/”,mainhandler),] app = tornado.wsgiapplication(urls,**设置):gunicorn -w torapp:app -b 0.0.0.0:让我们两个。flask app = flask(__ name __) @app.route(“/”)def hello():返回“我的源代码codlein the Mopaas Server the Mopaas Server by Python Tornado!“如果__name __ ==” __ -main __”:app.run()创建项目django-admin.py startprojec','gunicorn')的复杂环境对创建虚拟环境没有问题。应用比Saemopaas和Sae更好。
当使用django命令生成项目的基本结构时,配置信息将保留在settings.py文件中,以与项目目录同名目录的目录中。在实际开发中,对于一个项目,这通常是不合适的。将设置配置文件授予几个文件。将在线使用的文件放在base.py文件中,在product.py文件上的在线文件,开发测试文件放在devert.py fileessencethis函数部门中很明确,这对于我们的在线和离线调试非常方便。
1)在同名项目中,创建一个设置包(目录中包含__init__.py的文件夹)。
2)在设置软件包中创建3个新文件:public base base.py(用于配置Django默认配置文件),develop.py(用于开发环境)和product.py(用于生产环境)。
3)将原始设置的内容复制到base.py文件。
4)确认目录确定后,我们需要在base.py中修改时区和语言配置:
如果需要修改类似的公共零件,则可以在base.py(例如注册表应用程序)中修改它,这里没有示例。
5)之后,对于不同的在线和离线零件,我们只能导入base.py模块并将其修改为不同零件。例如,在线和离线对接不同的测试数据库,我们可以修改数据库连接:
6)修改Manage.py文件。使用自己的服务开始时,Django需要知道设置文件的路径。
7)生产时,请使用asgi.py(在django3.x中)或wsgi.py(django2.x版本),您可以更改生产配置文件的路径:
上述问题也有问题。如果在线和离线环境切换,我们需要更改代码,我们可以通过设置系统环境变量来动态获取它,以避免修改代码:
这样,Django通过在系统环境变量中读取Lipin_profile来加载不同的设置文件。
这可以删除原始设置.py文件!交叉
但是会有一个问题。您会发现我们无法访问以前的好网页,也找不到模板!
这是因为在先前的配置文件中,路径问题,因为我们的原始配置文件以同一名称为单位,现在我们被分为一个新软件包,因此我们需要转到第一级目录是我们需要的
结论:以上是首席CTO的所有内容都注明了Djangowsgi.py如何为所有人写的。感谢您阅读ContentForgot在此网站上找到它。