指南:本文的首席执行官注释将介绍有关如何调试Django头版的相关内容。我希望这对每个人都会有所帮助。让我们来看看。
过去,您选择了PythonWeb体系结构受到可用的Web服务器的约束,反之亦然。如果体系结构和服务器可以一起工作,那么您很幸运:
但是您可能会面临以下问题(或曾经)。当您将服务器与体系结构相结合时,您会发现它们不是作为协调工作设计的:
基本上,您只能使用可以一起运行的东西而不是要使用的东西。
那么,如何不修改服务器和体系结构代码以确保可以在多个体系结构下运行Web服务器?答案是pythonwebservergatewaywaywayinterface(或wsgi,称为“ wizgy”)。
WSGI允许开发人员将Web框架与Web服务器分开。现在您可以混合和匹配Web服务器和Web框架以选择适合您的配对。nginx/uwsgi或女服务员。真正的混合匹配是由于WSGI同时支持服务器和体系结构:
WSGI是开始问题的第一个和答案。您的Web服务器必须具有WSGI接口。所有现代的PythonWeb框架都已经具有WSGI接口。它使您可以一起工作以使服务器和特征网络框架共同起作用。
现在,您知道WSGI得到了Web服务器的支持,Web框架使您可以选择自己的匹配,但是它还为服务器和框架开发人员提供了便利性,因此他们可以专注于自己的首选字段和专业知识,而无需限制。其他语言中也有类似的界面:Java具有Servicetapi,Ruby具有机架。
说了很多话,你一定要大喊大叫,告诉我代码!好吧,看看这个极简主义的WSGI服务器实现:
#Teestwithpython2.7.9,Linuxmacosx
ImportSocket
ImportStringio
进口
classwsgiserver(对象):
adversion_family = socket.af_inet
socket_type = socket.sock_stream
request_queue_size = 1
def__init __(self,server_address):
#createalisteeneingsocket
self.listen_socket = listy_socket = socket.socket(
self.address_family,
self.socket_type
治愈
#AllowToreUseThesameDdress
#bind
listn_socket.bind(server_address)
#启用
listn_socket.lisen(self.request_queue_size)
#getServerHostNameanDport
主机,port = self.listen_socket.getSockName()[:2]
self.server_name = socket.getFQDN(主机)
self.server_port =端口
#returnheaderssetbywebframework/webapplication
self.headers_set = []
defset_app(self,application):
self.Application =应用程序
defserve_forever(self):
listn_socket = seld.listen_socket
何时:
#NewClientConnection
self.client_connection,client_address = listy_socket.accept()
#anderonRequestandCloseTheclientConnection.then
#loopovertoranotherclientconnect
self.handle_one_request()
defhandle_one_request(self):
self.request_data = request_data = self.client_connection.recv(1024)
#printformattedrequestdatala'curl-v'
打印(''。加入
'{线}
'.format(line = line)
forlineinrequest_data.splitlines()
))
self.parse_request(request_data)
#ConstructonvironmentIctIctIctInangrequequestdata
env = self.get_et_environ()
#它是静止的
#backaresultthatwillbecomehtpresponsebody
结果= self.application(env,self.start_response)
#constructareseanseandesenditbacktotheclient
self.finish_response(结果)
defparse_request(self,text):
request_line = text.splitlines()[0]
request_line = request_line.rstrip('
')
#BreakDownThereQuestLineIntocomponents
(self.request_method,#获取
self.path,#/你好
self.request_version#http/1.1
)= request_line.split()
defget_environ(self):
env = {}
#TheFollowIncodesnippetDoesnotFollowPep8conconconventions
#buuttt isformatedThewayItisfordEmstRpuss
#ToPlasezetherequiredVariables和Theirvalues
#
#requiredwsgivariables
env ['wsgi.version'] =(1,0)
env ['wsgi.url_scheme'] ='http'
env ['wsgi.input'] = stringio.stringio(self.request_data)
env ['wsgi.errrs'] = sys.stderr
env ['wsgi.multithread'] = false
env ['wsgi.multiprocess'] = false
env ['wsgi.run_once'] = false
#RequiredCgivariables
env ['request_method'] = self.request_method#get
env ['path_info'] = self.Path#/Hello
env ['server_name'] = self.server_name#localhost
env ['server_port'] = str(seld.server_port)#8888
返回
defstart_response(self,status,wendy_headers,exc_info = none):
#addn ResucessareServerHeaders
server_headers = [
('date','星期二,31mar201512:54:48gmt'),
('服务器','wsgiserver0.2'),
这是给予的
self.headers_set = [状态,响应_headers+server_headers]
#toadheretowsgispecificationtate_responsemustreturn
#a'write'callile.wesimplicity'ssake'llignorethatdetail
#目前。
#returnself.finish_response
Definish_Response(SELD,结果):
尝试:
状态,响应_headers = self.headers_set
响应='http/1.1 {状态}
'.format(状态=状态)
forheaderinresponse_headers:
响应+='{0}:{1}
'。格式(*标题)
响应+='
'
Fordatainrsult:
响应+=数据
#printformattedResponsetatala'curl-v'
打印(''。加入
'{线}
'.format(line = line)
forlineinresponse.splitlines()
))
self.client_connection.sendall(响应)
最后:
self.client_connection.close()
server_address =(主机,端口)='',8888
defmake_server(server_address,应用程序):
server = wsgiserver(server_address)
server.set_app(应用程序)
返回服务器
if__名称__ =='__ main__':
iflen(sys.argv)2:
sys.exit('provideawsgiapplicationObjectassmodule:callable')
app_path = sys.argv [1]
模块,应用程序= app_path.split(':')
模块= __导入__(模块)
应用程序= getttr(模块,应用程序)
httpd = make_server(server_address,application)
print('wsgiserver:servinghttponport {port} ...
'.format(port = port))
httpd.serve_forever()
这比第一个代码长得多,但是它足够短(只有150行),可以让您理解并避免详细信息。框架,金字塔,烧瓶,Django或其他Pythonwsgi框架。
不相信我吗?自己尝试一下。请访问上述weberver2.py的代码,或直接在github上下载。如果您不通过任何参数传递,它将提醒然后启动。
$ pythonwebserver2.py
supportgiapplicationObjectsmodule:callial
提示很清楚。没有设置模块(设置可能位于django.conf文件夹中,也可以是要找到错误的文件。您能找到一个错误图吗?
让我们的Django博客应用程序具有以下文章模型:
Blog/models.pyclass帖子(Models.Model):
# 标题
title = models.charfield(max_length = 70)
#正正
body = model.textfield()
#其他属性
def __str __(self):
返回self.title
首先,请参见步骤1,用户在搜索框中输入搜索关键字,因此我们需要为博客上的用户提供搜索表格。HTML表单代码可能是这样的:
形式方法=“ get” action =“/search/”
{%csrf_token%}输入类型=“搜索”占位符=“搜索”需要
按钮类型=“提交”搜索/按钮/表单
特别是,在表单标签下有一个{%csrf_token%}。这是Django捍卫Cross -Site请求伪造(CSRF)攻击的一种机制。如果您不知道CSRF是什么,这没关系。请记住,使用Django时,您必须将{%csrf_token%}添加到前端表单代码。
用户输入搜索关键字并单击搜索按钮后,将数据发送到Django背景服务器。表单的操作属性的值为 /搜索 /,表明用户提交的结果将发送到/search /this URL.我们绑定此URL的DJANGO视图函数,并在此视图函数中完成上一步2中提到的过程。支持我们在blog /views.py中编写视图函数的代码:
blog/views.pydef搜索(请求):
q = request.get.get('q')
error_msg =''
如果不是Q:
error_msg ='请输入关键字'
返回渲染(请求,'blog/errors.html',{'error_msg':error_msg})
post_list = post.objects.filter(title__icontains = q)
返回渲染(请求,'blog/results.html',{'error_msg':error_msg,
'post_list':post_list})
首先,我们使用request.get.get('q')获取用户提交的搜索关键字。用户通过表格Django提交的django存储在request.get中。这是一个类似于Python字典的对象,因此我们使用GET方法从字典中删除键Q的值,即用户的搜索关键字。此处的字典键称为,因为该字典的键是因为我们表格中输入框的名称属性为Q。如果修改了名称属性的值,则必须对此键的名称进行相应修改。
接下来,我们进行了少量验证。如果用户在不输入搜索关键字的情况下提交表单,则我们不需要执行查询,而是渲染错误的页面来指示用户应输入关键字。
如果用户输入搜索关键字,我们将通过过滤器方法从数据库中滤除所有合格的文章。此处的过滤条件是title__icontains = q,即关键字q包含(包含)关键字q,而前缀i表示,它没有区分情况。iContains是一个字段查找,用于与需要筛选的模型背后的两个下属线保持一致。Django有很多查询表达式。建议留下官方印象,以了解每个表达的角色。将来,您可以快速定位文档以查询文档的目的:现场查找
下一步是渲染搜索结果页面,显示符合搜索条件的文章列表。以下是模板的简单示例:
results.html
{%如果error_msg%} p {{error_msg}/p {%endif%}
{post_list%} div中的帖子
在此处显示文章的相应信息 /div {%空%} div class =“ no-pos”
没有合格的文章 /div {%endfor%}
视图函数后,请记住将视图函数映射到相应的URL。通过我们的表单数据提交的URL为 /搜索 /,因此视图功能搜索被键入URL。
blog/urls.pyurlpatterns = [
#其他URL配置
url(r'^search/$',views.search,name ='search'),]],]]
更大的功绩!
结论:以上是如何调试主要CTO注释的Django首页的相关内容,我希望它对您有所帮助!如果您解决问题,请与更多关心此的朋友分享问题?