今天,首席CTO Note将与您分享如何调试Django后端。其中,将详细介绍Django调试。如果您可以解决您现在面临的问题,请不要忘记注意此网站。让我们现在开始!
本文目录清单:
1.如何用Django编写代码的重要性2.调试用Java编写的后端,如何调试Django 3的前端3. Django Back -end -End允许Cross -domain 4.如何在该项目上部署Django项目服务器上的服务器和让它在背景5中运行5
1.扩展并包含在模板标签中是冲突。随着扩展,包含无法生效。原因是基础渲染的独立机制的设计。
2.#编码:UTF-8此句子只能在代码文件的第一行中生效,并且在注释字符串后面可能无效。
3.发布请求休息和Django的本机技术设施层由前端开发简化和交易包装前进。结果是可以将业务层放置在视图中。
4.用户的自我生成的文本内容页面上有一个用户。最好不要将帖子表格放在XSRF上。前者可能会窃取后者的令牌信息。
5.在模板==中,逻辑操作符号的两侧必须有一个空间,否则会影响模板分析
6.以表单的内部逻辑中的clean_data处理中抛出的异常。IS_VALID不会向外传递,但仅会变成form.is_valid()返回false。
7. Django的业务层和视图层如何划分问题,一种简单的方法是将业务层发送到哪个参数级别,我个人认为验证的表单更合适。
8.如果否则:1是直接处理它的两种简化的多级技术:12是中途回报的直接回报。尽管这不符合流程编程功能设计原理,但代码相对简单。
9. Ubuntu的生产环境不能以中文为单数,否则会导致错误。
10.由于Django的500个机制和交易机制,Django视图层与异常处理代码相对较弱。
11.模型表格定义:没有出现在首页上的字段,请确保掉落或null,但null会影响默认值,因此最好的方法是掉落。否则,由于表单中的字段似乎并未覆盖默认值为null。比排除更方便的定义方法是定义字段元信息,因此模型添加了未使用的字段,您无需运行到RE- 填写表单定义
12.数据库 - 内存数据的格式显示在模板中显示带有诸如日期之类的过滤器。如果您直接使用DateTime的横Striftime格式化,它将导致时区数据丢失。时间是值得的。如果您在代码中的Strifttime中处理它,则可以首先使用django.utils.timezone.localtime方法。
13. Django调试中的一个问题:众所周知,RunServer启动,更改代码,服务将重新启动,但是更改自定义标签代码,服务不会重新启动。
14.表单验证的错误中没有文本信息。看文档前一段时间,我发现新版本加强了错误。在较旧版本中,我编写了一个函数来分析错误对象的反馈文本信息。
15.通过Manytomany字段无法添加或删除。为了进行可伸缩性,建议默认情况下添加。您可以将date_added字段添加到中间关系表中。顺便说一句,唯一_together受到限制,但是使用的使用是有缺陷的:WriteThe操作有点麻烦。应首先删除这个Manytomany字段,然后迁移生效,然后添加一个Manytomany字段。当然,背景是在背景中。
过去,您选择了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-cors头
通过PIP安装:
Django项目设置
安装完成后,您需要设置一些设置:
几天前,老师要求我将Django Project(爬行动物网页)放在校园的内网上,但我想先用自己的服务器尝试一下。我刚刚在数字海洋上购买了一台服务器以运行SS脚本。通常,服务器始终没有用,因此请进行测试。
第一步并没有太多胡说八道,将Django文件通过WINSCP软件传递给服务器。
在服务器中安装Django所需的环境和我需要的第三方库。
完成上述步骤完成后,有必要执行一个步骤操作,这是我体验的一个坑。在Django文件目录中打开settings.py,然后将允许的_hosts = []更改为werse_hosts = [**“*”]。
打开“ anage.py位于服务器中”的目录,然后输入命令:
python3 manage.py runserver 0.0.0.0:8000
然后按Enter并输入浏览器:服务器IP地址:8000,伟大的成就!
注意力:
1. Python3不是特定的,它是根据您的Django项目所需的环境指定的。
2. 8000是可以修改的端口号。
如果您希望Django项目在关闭终端后运行和运行,则需要运行以下命令,NOHUP命令,命令casted Python3 Manage.py Runserver 0.0.0.0.0.0:8000。
Djangot调试的两种方法:
1.由于使用python manage.py,常用的打印方法
Runserver实际上是通过促进子过程的过程。子进程的标准输出不知道它在哪里,因此只能让调试服务器以子进程的方式执行。
manage.py runserver
- NOWLOAD,以便可以在终端中看到打印的信息,但是如果这样做,则需要每次修改Python代码时重新启动服务器。
2.输出日志到终端:
记录= {{{
“版本”:1,
'disable_existing_loggers':false,
'formatters':{
'简单的': {
'格式':'%(levelName)s%(消息)s'
结论:以上是Django的后端和Django如何调试首席执行官指出的全部内容。我希望这对每个人都会有所帮助。如果您想了解有关此信息的更多信息,请记住要收集对该网站的关注。