简介:许多朋友询问了Django如何更改请求的要求。本文的首席执行官注释将为您提供详细的答案,以供您参考。我希望这对每个人都会有所帮助!让我们一起看看!
好的:
URL中的相应定义:
示例1:
urls.py
urlpatterns = [
url(r'^add/(d+)/((d+)$',views.add,),
这是给予的
Views.py
def add(请求,a,b):
c = int(a)+int(b)
返回httpresponse(str(c))
示例2:
urls.py
urlpatterns = [
url(r'^add3/(?pusernamew+)/(?puser_idd+)/',views.add3,name =“ add3”),,
这是给予的
这是用户名,user_id。在与视图相对应的函数中,参数名称必须与URL中的命名一致
View.py
def add3(请求,用户名,user_id):
返回httpresponse(“用户名:”+username+“,user_id:”+user_id)
操作_summary:操作名称如下所示
操作_desscripting:接口简介如下所示
操作_id:操作方法名称如下所示
手动_Parameters:在参数中修改参数描述
request_body:张贴发送内容如下所示
响应:响应的内容如下所示
枚举:定义修改后字段的参数值,默认编写第一个字段。如下所示
描述:字段说明
类型:字段需要什么类型的数据
type_object =“对象”
type_string =“字符串”
type_number =“数字”
type_integer =“整数”
type_boolean =“布尔值”
type_array =“数组”
type_file =“文件”
格式:如何验证
format_date =“ date”
format_datetime =“ date time”
format_password =“密码”
format_binary =“二进制”
format_base64 =“字节”
format_float =“ float”
format_double =“ double”
format_int32 =“ int32”
format_int64 =“ int64”
format_email =“电子邮件”
format_ipv4 =“ ipv4”
format_ipv6 =“ ipv6”
format_uri =“ uri”
format_uuid =“ uuid”
format_slug =“ slug”
format_decimal =“十进制”
字符串路径= request.getContextPath();字符串basepath = requestscheme()+“://”+“+”+“ requestServername()+”:“+requestServerport() - ” - “ //” //“/”/“/”/“/”/“/”/“/”/“ -”;“ //”/“/”/“/”;“ //”/“/”/“;“ //” - “;” //“/”/“/”;“ //”/“ - ”;“/”;“ //”/“/”;“ //”/“/”;“/”;“/”;“ //”/“;”; //“;” //“; //”; //“; //”; //“; //”; //“; //”; //“; //”; //“;//;///“;//”;//“;//”;//“;//”;//“;//”;//".is是您项目的根路径
服务器收到HTTP协议的请求后,将根据消息创建HTTPRequest对象视图函数的第一个参数。
形式标签中的“获取”和“帖子”
在HTML中,表单的作用是在标签中收集内容。然后,这些内容将发送到服务器。
一种表格必须指定两件事:
表格表格提交的示例:
您可以在地址栏中看到参数。
表格表格提交的示例:
一个-Click Multi -Value GetList方法:
请求对象的属性是获取的,帖子是querydict类型的对象
与Python词典不同,Querydict类型的对象用于处理具有多个值的多个值的相同键
获取属性:
查看类视图基于请求方法。
以相应的方式,编写相应的逻辑函数。
它是在视图中的方法中编写逻辑。
参考查看视图。
url.py中的配置路由是通过:as_view()
当文件上传Django时,文件数据将保存在request.files上。文件中的每个键是输入type =“ file” name =“” /名称中的名称。
设置文件的存储路径:
1.在项目的根目录下,在静态中创建媒体文件夹
2.上传图片后,它将保存到“/static/媒体/文件”中
3.打开settings.py文件以增加媒体_root项目
仅在启用请求方法和提交enableype =“ multipart/form-data”的情况下才包含数据。否则,文件将是类似于字典的空对象
文件由文件函数上传:
httpresponse对象:
httpresponse的子类:
返回数据的响应函数是:
httpresponse()返回到简单的字符串对象
Render()渲染模板
重定向()重定向
jsonresponse()返回json数据
HTTP协议:
HTTP(超文本传输协议)是一个应用程序层协议,由请求和响应组成,是标准客户端服务器模型。HTTP是无状态协议。
客户端和服务器如何记录登录状态?
在浏览器中---- cookie :(请自己找到)
注意:设置cookie值并删除cookie值是响应对象的所有操作,并且从相应的通信中获得了获得的cookie。
尽管可以保留cookie,但请注意不要存储敏感信息。
许多Django应用程序需要执行异步任务,以免延迟HTTP请求的执行。我们还可以选择许多方法来完成异步任务。使用克莱里是一个更好的选择,因为克莱里
有了大量的社区支持,它可以完美扩展,与Django结合使用也很好。芹菜不仅可以在Django中使用,而且可以在其他地方使用。因此,一旦您学会使用克莱利,我
我们可以在其他项目中非常方便地使用它。
1.克莱里版本
这篇博客文章主要针对芹菜3.0.x。克莱里的早期版本可能有轻微的差异。
2. Cerry介绍
Clery的主要用途是执行异步任务。您可以选择扩展或定期执行功能。为什么需要执行异步任务?
首先,假设用户正在启动请求并等待返回请求。在此请求背后的视图函数中,我们可能需要执行长期的过程任务。目前,我们可能
它可能远大于用户公差的范围。当不需要立即执行此任务时,我们可以使用Clery在后台执行,而不会影响用户浏览Web。
当涉及到,我们通常无法确定它花费的时间。
第二个是定期执行常规任务。例如,您需要每小时检查天气预报,然后将数据存储到数据库中。我们可以编写此任务,然后让芹菜执行
Web应用程序可以获取最新的天气预报信息。
我们在这里谈论的任务是python函数(函数)。定期执行任务可以延迟执行此功能。我们可以使用Clery将功能延迟5分钟5分钟。
任务1并传递参数(1、2、3)。或者我们也可以每天午夜运行该功能。
我们偏向项目中的项目,这对于访问统一数据库和Django设置的任务很方便。
准备好任务后,芹菜会将其放在队列队列中。队列存储任务列表。我们可以使用多个队列,但是为简单起见,我们在这里只使用一个。
将任务任务放在队列中就像加入TODO列表一样。为了使任务运行,我们还需要在其他线程中运行艰苦的工作。工人观察实时行动的任务,然后一一运行。
一些任务。您可以在不同的服务器上使用多个工人。同样,为简单起见,我们只使用一个工人。
我们将在以后讨论队列,工人和另一个非常重要的过程。接下来,让我们这样做:
3.安装克莱里
我们可以使用PIP在vietualenv中安装:
PIP安装django-clery
4. Django设置
我们暂时使用Django Runserver来启动Clery。和芹菜代理,我们使用Django数据库代理实现。现在我们只需要知道克莱里芹菜
需要经纪人,您可以使用Django本身作为经纪人。(但是,当部署时,我们最好使用更稳定和高效的布拉克,例如Redis。)
在steratings.py中:
导入djcelery
djcelery.setup_loader()
broker_url ='django://'
Em
instasted_apps =((
Em
'djcelery',
'kombu.transport.django',
Em
治愈
第一个和第二个项目是必要的,第三个项目告诉芹菜将Django项目用作经纪人。
添加到installed_apps中的djcelery是必要的。kombu.transport.django是基于Django的经纪人
最后创建芹菜所需的数据表。如果您将South用作数据迁移工具,请运行:
python manage.py迁移
否则,运行:( Django 1.6或Django 1.7可以)
python manage.py syncdb
5.创建一个任务
如前所述,任务是Pyhton功能。但是芹菜需要知道此功能是任务,因此我们可以使用装饰器:@task。
在django应用程序目录中创建taske.py:
从芹菜导入任务
@任务 ()
def add(x,y):
返回x + y
当settings.py运行中的djcelery.setup_loader()时,Clery将在APPS Directory中的App Directory中的所有task.py文件中查看Appled_apps中的App Directory中的所有task Files,查找标记为任务的函数,并且预防。
将它们注册为Clery任务。
标记函数作为任务不会阻碍其正常执行。您仍然可以像往常一样称呼它:z = add(1,2)。
6.执行任务
让我们从一个简单的示例开始。例如,我们希望在用户发送请求并立即返回响应后执行任务异步,以免阻止请求,用户可以平稳访问
过程。然后,我们可以在Views.py的视图中使用.delay:
从myapp.tasks导入添加
Em
add.delay(2,2)
Em
克莱里将添加任务以排队并立即返回。在看到工人一侧的任务后,它将根据设置执行并将其从队列中删除。工人将执行以下一代。
代码:
导入myapp.tasks.add
myapp.tasks.add(2,2)
7.关于导入
应该注意的是,当IMPPRT任务时,它需要保持一致。因为执行djcelery.setup_loader()时,任务基于installed_apps中的应用程序名称。
添加.tasks.function_name进行注册。如果由于不同的Python路径而使用不同的参考方法(例如,使用MyProject.myapp.tasks在tasks.py中导入的the。
添加表单),Cerly不会知道这是同一任务,因此可能会导致奇怪的错误。
8.测试
A。开始工人
如前所述,我们需要一个工人来执行任务。以下是如何在开发环境中启动工人的方法:
首先启动终端,例如开发Django项目,激活Virtualenv,切换到Django Project目录。然后启动django构建的Web服务器:Python Manage.py Runserver。
然后开始工人:
python manage.py芹菜工人-loglevel =信息
目前,工人将在终端运行并显示输出结果。
b。开始任务
打开新终端,激活Virtualenv,然后切换到Django项目目录:
$ python manage.py shell
从myapp.tasks导入添加
add.delay(2,2)
目前,您可以看到工人在工作窗口中执行任务:
[2014-10-07 08:47:08,076:info/mainprocess]从经纪人获得任务:myapp.tasks.add [e080e047-b2a2a7-af74-af74-d7d98b02fc]
[2014-10-07 08:47:08,299:info/mainprocess]任务myapp.tasks.add [e080e047-b2a2-43a2-43a7-af74-af74-d7d98b02fc]
9.另一个例子
让我们看一个更真实的示例,即views.py和tasks.py:
#views.py
来自myApp.tasks导入do_something_with_form_data
def视图(请求):
form = someform(request.post)
如果form.is_valid():
data = form.clenet_data
#安排任务以稍后进行数据
do_something_with_form_data.delay(data)(数据)
返回render_to_response(...)
#tasks.py
@任务
def do_something_with_form_data(数据):
call_slow_web_service(data ['用户'],data ['text'],...)
10.调试
由于克莱里的操作需要启动多个组件,因此我们可能会错过一两个组件。因此,我们建议:
使用最简单的设置
使用Python调试和记录功能显示当前过程
11.渴望模式
如果在设置中的设置。py:
Celery_always_eager = true
然后芹菜以急切的模式运行,然后任务不需要添加延迟即可运行:
#如果启用了急切的模式,则以下两行代码是相同的
add.delay(2,2)
添加(2,2)
12.查看队列
因为我们将Django用作经纪人,所以排在Django数据库中的队列。这意味着我们可以通过Django管理员查看队列:
#admin.py
来自django.contrib导入管理
从kombu.transport.django导入模型为kombu_models
Admin.Site.Register(Kombu_models.message)
13.检查结果
运行异步任务后,芹菜将异步对象返回结果。您可以保存它,然后检查任务是否成功运行并返回结果:
#views.py
结果= add.delay(2,2)
Em
如果结果。dready():
打印“任务已运行”
如果结果。Successful():
打印“结果为:%s”%结果。
别的:
如果是isInstance(结果,例外):
打印“任务失败,原因是提出例外”
提高结果
别的:
打印“任务失败而没有提高例外”
别的:
打印“任务尚未运行”
14.常规任务
还有一种普通的牧师来执行常规任务。执行常规任务时,芹菜将通过芹菜过程完成。将维护芹菜。一段时间后,需要执行一定时间。
走路时,芹菜症将其添加到队列中。与工作过程不同,芹菜只需要一个。
启动CleryBeat:
python manage.py Clery Beat
有很多方法可以使芹菜执行常规任务。让我们先查看第一个,然后将常规任务存储在Django数据库中。即使在Django和Clery中运行的状态
方便地修改常规任务。我们只需要在设置中设置一个即可打开此方法:
#settings.py
Celerybeat_scheduler ='djcelery.schedulers.databasescheduler'
httprequest对象
httprequest是指从客户端单独的HTTP请求。
httprequest实例的属性包括有关请求的最重要信息(请参阅表H-1)。除了会话外,所有属性应仅被视为读取。
表H-1。httprequest对象属性
属性
描述
路径指示字符串提交了请求页的完整地址,不包括域名,例如“/music/bands/the_beatles/”。
方法
指示提交请求的HTTP方法。它始终是大写。例如:
如果request.method =='get':
做一点事 ()
Elif Research.Method =='Post':
do_something_else()
获取字典对象包含有关所有HTTP的GET参数的信息。请参阅QueryDict文档。
邮政
字典对象包含有关所有HTTP POST参数的信息。请参阅查询文档。
通过帖子提交的请求可能包含一个空词典,也就是说,通过POST方法提交的表格可能不包含数据。因此,使用方法不应使用unignes.post来判断使用方法。相反,应该使用它。
注意:发布不包括文件上传信息。请参阅文件。
要求
为了方便起见,这是一个字典对象,首先搜索帖子,然后搜索php的$ _reqeust。
例如,如果您获得= {“ name”:“ john”},则post = {“ age”:'34'},请求[“ name”]将为“ john”,请求[age'age']将为”34“
强烈建议使用获取和发布而不是请求。这是用于远程兼容性和更清晰的表达式。
cookies标准python词典包含所有cookie.base和值是字符串。请参阅第12章cookie使用的更多信息。
文件
字典对象包含所有已上传的文件。文件键来自input type =“ file” name =“” /。文件的值是标准Python字典,其中包含以下三个键:
文件名:字符串,指示文件的文件名。
内容类型:上传文件的内容类型。
内容:上传文件的原始内容。
请注意,仅在请求方法中的文件是发布的,并且提交的表单包含eNableype =“ multipart/form-data”。否则,文件只是一个空词典对象。
元
标准Python字典包含所有有效的HTTP标头信息。有效的头信息与客户端和服务器有关。这里有几个示例:
content_length
内容类型
query_string:不可预测的原始请求字符串。
远程_ADDR:客户端IP地址。
remote_host:客户端主机名。
server_name:服务器主机名。
server_port:服务器端口号。
例如,Meta中的任何HTTP标头信息都是HTTP_前缀的关键,例如::
http_accept_encoding
http_accept_language
HTTP_HOST:客户端发送的主机标头信息。
HTTP_REFERR:如果存在,则指向页面。
http_user_agent:客户端的用户代理字符串。
http_x_bnder:X弯头标头信息的值,如果设置为。
用户
django.contrib.auth.models.user对象表示当前登录用户。如果当前用户尚未登录,则用户将设置django.contrib.auth.models.models.models.models.somoususe.you可以将它们与is_authenticated区分开():
如果request.user.is_authenticated():
#为登录用户做点事。
别的:
#为匿名使用。
当Django激活AuthenticationMiddleware时,用户很有效。
有关认证和用户的完整详细信息,请参见第12章。
会话A可读和写作字典对象表示当前的会话。当Django激活会话支持时,这是有效的。请参阅第12章。
RAW_POST_DATA发布原始数据。用于数据的复杂处理。
请求对象还包含一些有用的方法,请参见表H-2。
表H-2。httprequest方法
方法
描述
__getItem __(键)
请求的get/post值,首先找到帖子,然后获取。如果密钥不存在,则会导致异常的钥匙孔。
此方法允许用户通过访问字典访问HTTPRequest实例。
例如,请求[“ foo”]并在检查request.get [“ foo”]之前检查request.post [“ foo”]。
has_key()返回对还是错,以识别request.get.get或request.post。
get_full_path()返回路径。如果请求字符串有效,则将连接到它。例如,“/music/bands/the_beatles/?print = true”。
is_secure()如果请求是安全的,请返回true。换句话说,请求以HTTPS的形式提交。
查询对象
在httprequest对象中,获取和帖子属性是django.http.querydict.querydict的示例,是一个类似于字典的类,该类专门用于处理键的多值。该类需要处理该类需要处理某些元素,以处理某些元素。HTML形式,尤其是在选择多个传递相同密钥时传达相同键的元素时。
翻译...
querydict实例是不可变的,除非创建了副本()副本。
Querydict实现了所有标准字典的方法,因为它是字典的子类。表H-3中列出了不同的内容。
表H-3。查询和标准词典
方法
与标准字典实施不同
__getItem__与字典相同。但是,当键具有多个值时,__getItem __()返回最后一个值。
__setItem__将密钥的值设置为[值](仅一个值元素的Python列表)。注意,由于在其他字典函数上存在副作用,因此只能称为变量QueryDict(由COPY(COPY()创建)。
get()如果一个键多数值,例如__getItem__,get()将返回最后一个值。
更新 ()
该参数是querydict或标准字典。标准词典
更新不同,此方法*增加*而不是替换内容:
q = querydict('a = 1')
q = q.copy()#使其可更改
q.update({'a':'2'})
Q.GetList('a')
['1','2']
问['a']#返回最后一个值
['2']
项目 ())
像标准字典的tocke()方法一样,区别在于它与__getItem()__相同,并返回最后一个值:
q = querydict('a = 1a = 2a = 3')
q.items()
[('a','3')]
值()与标准字典的值()方法相同。区别在于它将最后一个值返回为__getItem()__。
此外,Querydict在表H-4中列出了一种方法。
表H-4。附加(合成)Querydict方法
方法
描述
copy()返回python标准库中使用copy.deepcopy()对象的副本。此副本是可变的,也就是说,您可以更改其值。
getList(键)以python列表的形式返回请求密钥的数据。如果键不存在,请返回空列表。它保证它将返回一定的列表。
setList(key,list_)将密钥的键值设置为list_(不同于__setitem __())。
AppendList(键,项目)在密钥相关列表中添加了项目。
setListDefault(key,l)与setDefault相同。区别在于其第二个参数是列表,而不是值。
列表()
像项目()一样,区别在于它在列表的列表中返回字典中每个成员的所有值。例如:
q = querydict('a = 1a = 2a = 3')
q.lists()
[('a',['1','2','3']]]
urlencode()以请求字符串格式返回数据字符串(例如“ a = 2b = 3b = 5”)。
一个完整的例子
例如,给定此HTML表格:
形式action =“/foo/bar/” method =“ post”
输入类型=“ text” name =“ your_name” / / /
选择多重=“多个”名称=“ band”
选项值=“甲壳虫”披头士乐队/选项
选项值=“谁” WHO/选项
选项值=“僵尸”僵尸/选项
/选择
输入类型=“提交” / /
/形式
如果用户在your_name中输入“ John Smith”,然后在多项选择帧中选择甲壳虫乐队和僵尸,则以下是Django请求对象的所有者:
request.get
{}
request.post
{'Your_name':['John Smith'],'bands':['Beatles','Zombies']}}}}
request.post ['your_name']
'约翰·史密斯'
request.post ['bands']
“僵尸”
request.post.getList('bands')
['甲壳虫乐队','僵尸']
request.post.get('your_name','adrian')
'约翰·史密斯'
request.post.get('nonexistent_field','无处男人')
“无处男人”
使用时请注意:
获取,发布,cookie,文件,元,请求,RAW_POST_DATA和用户被延迟加载。换句话说,除非它们在代码中访问它们,否则Django不会花费资源来计算这些属性值。
结论:以上是首席CTO汇编的Django相关内容的摘要,请注意Django如何更改请求的相关内容,我希望它对您有所帮助!如果您解决问题,请与更多朋友分享。谁关心这个问题?