django通用视图通俗讲解,django详细教程
view函数(类),简称view,是一个简单的Python函数(类),接受Web请求并返回Web响应。
响应可以是网页的HTML内容、重定向、404错误、XML文档或图像。
无论视图本身包含什么逻辑,都应该返回一个响应。代码写在哪里并不重要,只要它在您当前的项目目录下。除此之外,没有更多的要求。——可以说是“没什么神奇的”。为了将代码放在某个地方,通常将视图放在项目或应用程序目录中名为views.py的文件中。
简单视图下面是一个以HTML文档形式返回当前日期和时间的视图:
从django.http导入HttpResponse
导入日期时间
定义当前日期时间(请求):
now=datetime.datetime.now()
html= html body现在是%s. /body /html % now
返回HttpResponse(html)
让我们一行一行地解释上面的代码:
首先,我们从django.http模块和Python的datetime库导入了HttpResponse类。然后,我们定义current_datetime函数。它是视图功能。每个视图函数使用一个Httprequest对象作为它的第一个参数,它通常被称为request。
注意,视图函数的名称并不重要;它不需要以统一的方式命名,以便Django可以识别它。我们把它命名为current_datetime,因为这个名字可以准确地反映它的功能。该视图将返回一个HttpResponse对象,其中包含生成的响应。每个视图函数负责返回一个HttpResponse对象。Django使用请求和响应对象在系统中传递状态。
当浏览器向服务器请求页面时,Django创建一个HttpRequest对象,其中包含关于请求的元数据。然后,Django加载相应的视图,并将这个HttpRequest对象作为第一个参数传递给视图函数。
每个视图负责返回一个HttpResponse对象。
CBV和FBV我们以前写过基于功能的观点,这叫做FBV。您也可以将视图编写为基于类的。
以我们之前提到的添加类为例:
FBV版本:
# FBV版增加班级
定义添加类(请求):
if request.method==POST :
class_name=请求。POST.get(class_name )
模特。classes . objects . create(name=class _ name)
返回重定向(/class_list/)
return render(请求, add_class.html )
CBV版本:
# CBV版增加班级
从django.views导入视图
class AddClass(视图):
def get(自身,请求):
return render(请求, add_class.html )
定义发布(自己,请求):
class_name=请求。POST.get(class_name )
模特。classes . objects . create(name=class _ name)
返回重定向(/class_list/)
注意:
使用CBV时,urls.py也会做相应的修改:
# urls.py
url(r^add_class/$,观点。AddClass.as_view()),
装饰风景。用装饰器装饰FBVFBV本身就是一个函数,所以这和给普通函数添加一个装饰器是一样的:
定义包装器(函数):
def inner(*args,**kwargs):
start_time=time.time()
ret=func(*args,**kwargs)
end_time=time.time()
打印(已用:,结束时间-开始时间)
返回ret
返回内部
# FBV版增加班级
@包装
定义添加类(请求):
if request.method==POST :
class_name=请求。POST.get(class_name )
模特。classes . objects . create(name=class _ name)
返回重定向(/class_list/)
return render(请求, add_class.html )
用装饰器装饰CBV类中的方法与独立函数不完全相同,所以我们不能直接将函数装饰器应用于类中的方法。我们需要先把它转换成一个方法装饰器。
Django中提供了method_decorator decorator,用于将函数decorator转换为方法decorator。
# CBV版增加班级
从django.views导入视图
从django . utils . decorator导入method_decorator
class AddClass(视图):
@method_decorator(包装器)
def get(自身,请求):
return render(请求, add_class.html )
定义发布(自己,请求):
class_name=请求。POST.get(class_name )
模特。classes . objects . create(name=class _ name)
返回重定向(/class_list/)
#使用CBV时,需要注意的是,dispatch()方法会在请求到来后首先执行。如果需要对特定的请求处理方法做一些操作,比如get、post等。在批处理中,这里我们可以手动重写dispatch方法,这与向FBV添加装饰器的效果相同。
班级登录(查看):
定义调度(自身,请求,*参数,*kwargs):
打印(“之前”)
obj=super(登录,自己)。派遣(请求,*参数,*克沃格)
打印(“之后”)
返回对象
def get(自身,请求):
返回render(请求, login.html )
定义发布(自己,请求):
打印(请求。POST.get(user ))
返回HttpResponse(Login.post )关于CBV的延伸阅读
请求对象当一个页面被请求时,Django会创建一个包含这个请求的原始信息的HttpRequest对象。
Django会自动将这个对象传递给响应视图函数。通常,视图函数通常使用请求参数来处理这个对象。
公文
请求的相关公共值path_info返回用户访问url,不包括域名方法请求中使用的HTTP方法的字符串表示,全部大写。GET类字典对象包含所有HTTP GET参数POST类字典对象包含所有HTTP POST参数体请求体,请求的数据为字节类型。POST是从正文中提取的属性。除非另有说明,否则所有属性都应被视为只读。
属性:
Django将请求消息中的请求行、头信息和内容体封装到HttpRequest类的属性中。
除非另有说明,否则其他都是只读的。
0.HttpRequest.scheme
表示所请求方案的字符串(通常是http或https)
1.HttpRequest.body
表示请求消息正文的字符串。在处理非HTTP消息时非常有用,比如二进制图像、XML、Json等。
但是,如果要处理表单数据,建议使用HttpRequest.POST。
另外,我们也可以用python的类文件方法来操作它。详情请参考HttpRequest.read()。
2.HttpRequest.path
一个字符串,表示请求的路径组件(不包括域名)。
例如:“/music/bands/the _ beats/”
3.HttpRequest.method
一个字符串,表示请求使用的HTTP方法。必须大写。
示例:“获取”、“发布”
4.HttpRequest.encoding
一个字符串,表示提交数据的编码方式(如果为None,则表示使用DEFAULT_CHARSET的设置,默认为 utf-8 )。
此属性是可写的,您可以修改它来修改用于访问表单数据的编码。
对该属性的任何后续访问(如从GET或POST读取数据)都将使用新的编码值。
如果您知道表单数据的编码不是DEFAULT_CHARSET,请使用它。
5.HttpRequest . GET
一个类似字典的对象,包含HTTP GET的所有参数。有关详细信息,请参考QueryDict对象。
6.HttpRequest.POST
一个类似于字典的对象,如果请求包含表单数据,它会将数据封装到一个QueryDict对象中。
该请求可以具有空的POST字典——。如果表单是通过HTTP POST方法发送的,但是表单中没有数据,则仍然会创建QueryDict对象。
因此,如果要求话。不应使用POST来检查是否使用了POST方法;您应该使用if request.method==POST
此外,如果您使用POST上传文件,文件信息将包含在文件属性中。
7.COOKIES
包含所有cookie的标准Python字典。键和值都是字符串。
8.文件
一个类似于字典的对象,包含所有上传的文件信息。
文件中的每一个键都是输入type=file name=/中的名称,值是对应的数据。
请注意,只有当请求的方法是POST并且提交的表单具有enctype=multipart/form-data 时,文件才可用
包括数据。否则,文件将是一个空的类似字典的对象。
9.HttpRequest.META
一个标准的Python字典,包含所有的HTTP头。的具体标头信息取决于客户端和服务器。以下是一些例子:
CONTENT_LENGTH ——请求体的长度(字符串)。
请求体的MIME类型。
HTTP_ACCEPT ——响应可接受的内容类型。
Http _ accept _ encoding3354响应的可接受编码。
HTTP_ACCEPT_LANGUAGE ——响应的可接受语言。
HTTP_HOST ——客服发送的HTTP主机头。
HTTP_REFERER ——引用页面。
HTTP_USER_AGENT ——客户端的用户代理字符串。
QUERY_STRING ——单个字符串形式的查询字符串(未解析形式)。
远程_ADDR ——客户端的IP地址。
REMOTE_HOST ——客户端的主机名。
服务器的REMOTE_USER ——认证用户。
REQUEST_METHOD ——一个字符串,如“GET”或“POST”。
SERVER_NAME ——服务器的主机名。
SERVER_PORT ——服务器的端口(是一个字符串)。
从上面可以看出,当请求中的任何HTTP头转换成除CONTENT_LENGTH和CONTENT_TYPE之外的META的键时,
大写所有字母,用下划线替换连接符,后跟HTTP_ prefix。
所以,一个名为X-Bender的头将被转换成META中的HTTP_X_BENDER键。
10.HttpRequest.user
表示当前登录用户的AUTH_USER_MODEL类型的对象。
如果用户当前未登录,用户将被设置为django . contrib . auth . models . anonymous用户的实例。可以通过is_authenticated()来区分它们。
例如:
if request . user . is _ authenticated():
#为登录用户做点什么。
否则:
#为匿名用户做点什么。
仅当Django启用了AuthenticationMiddleware中间件时,用户才可用。
-
匿名用户
班级模型。匿名用户
django . contrib . auth . models . anonymous用户类实现了django . contrib . auth . models . user接口,但它有以下区别:
Id始终为None。
用户名总是空字符串。
Get_username()总是返回空字符串。
Is_staff和is_superuser始终为False。
Is_active始终为False。
组和user_permissions始终为空。
Is_anonymous()返回True而不是False。
Is_authenticated()返回False而不是True。
Set_password()、check_password()、save()和delete()会引发NotImplementedError。
Django 1.8中的新功能:
添加AnonymousUser.get_username()更好地模拟django . contrib . auth . models . user。
11.HttpRequest.session
可读写的类似字典的对象,表示当前会话。仅当Django启用会话支持时可用。
如需完整的详细信息,请参阅进程的文档。属性相关性
上传文件示例
定义上传(请求):
在上传文件之前,数据需要存储在某个地方。当默认上传文件小于2.5M时,django会将上传文件的所有内容读入内存。从内存读取一次,写入磁盘一次。
但是,当上传的文件非常大时,django会将上传的文件写入一个临时文件,然后存储在系统的临时文件夹中。
:参数请求:
:返回:
if request.method==POST :
#从请求的文件中获取上传文件的文件名,其中file是页面上输入的type=files类型的name属性值。
文件名=请求。文件[文件]。名字
#在项目目录中创建新文件
用open(文件名, wb )作为f:
#从上传的文件对象中一点一点地读取
对于请求中的块。文件[文件]。组块():
#写入本地文件
f.write(块)
返回HttpResponse (Upload OK )上传文件示例代码
方法
1.HttpRequest.get_host()
根据HTTP_X_FORWARDED_HOST(如果USE_X_FORWARDED_HOST打开,默认为False)和HTTP_HOST头信息,返回请求的原始主机。
如果这两个头没有提供相应的值,则使用SERVER_NAME和SERVER_PORT,这在PEP 3333中有详细描述。
USE_X_FORWARDED_HOST:一个布尔值,指定是否先使用X-Forwarded-Host头,只有在代理设置了此头的情况下才能使用。
例如:“127.0.0.1:8000”
注意:当主机位于多个代理之后时,get_host()方法将失败。除非用中间件重写代理的头。
2.HttpRequest.get_full_path()
返回路径,如果可以将查询字符串添加到。
例如:/music/bands/the _ beats/? print=true
3.http request . get _ signed _ cookie(key,default=RAISE_ERROR,salt= ,max_age=None)
返回与签名的Cookie相对应的值,或者如果签名不再合法,则返回django . core . signing . bad signature。
如果提供了default参数,将不会引发任何异常,并将返回default值。
可选salt参数可用于提供针对安全密钥强力攻击的额外保护。max_age参数用于检查对应于Cookie的时间戳,以确保Cookie的时间不会超过max_age秒。
复制代码
request . get _ signed _ cookie( name )
托尼的
request . get _ signed _ cookie( name ,salt=name-salt )
假设设置cookie时使用相同的盐。
request.get_signed_cookie(不存在的cookie )
.
错误:“不存在的cookie”#没有相应的密钥时会触发异常。
request . get _ signed _ cookie( non-existing-cookie ,False)
错误的
request.get_signed_cookie(被篡改的cookie )
.
错误签名:
request . get _ signed _ cookie( name ,max_age=60)
.
签名过期:签名年龄1677.39159 60秒
request . get _ signed _ cookie( name ,False,max_age=60)
错误的
复制代码
4.HttpRequest.is_secure()
返回True请求时是否安全;也就是说,请求通过HTTPS启动。
5.HttpRequest.is_ajax()
如果请求是通过XMLHttpRequest发起的,则通过检查HTTP_X_REQUESTED_WITH的对应头是否是字符串“XMLHttpRequest”来返回True。
大多数现代JavaScript库都发送这个头。如果您编写自己的XMLHttpRequest调用(在浏览器端),则必须手动设置该值才能使is_ajax()工作。
如果响应需要基于请求是否通过AJAX发起,并且您使用了某种形式的缓存,比如Django的缓存中间件,
您应该用Vary _ on _ headers( http _ x _ requested _ with )来修饰您的视图,以便可以正确地缓存响应。请求相关方法
注意:当键值对有多个值时,比如复选框类型的输入标记和选择标记,需要使用:
请求。POST.getlist(爱好)
相比Django自动创建的HttpRequest对象,HttpResponse对象是我们负责的。我们编写的每个视图都需要实例化、填充并返回一个HttpResponse。
HttpResponse类位于django.http模块中。
使用密码字符串
从django.http导入HttpResponse
response=HttpResponse(这是网页的文本。)
Response=httpresponse(请只显示文本。,content _ type= text/plain )设置或删除响应标头信息。
response=HttpResponse()
响应[ Content-Type ]= text/html;charset=UTF-8
Del response[Content-Type]属性HttpResponse.content:响应内容
charset:响应内容的编码
HttpResponse.status_code:响应的状态代码。
JsonResponse对象JsonResponse是HttpResponse的一个子类,专门用于生成JSON编码的响应。
从django.http导入JsonResponse
response=JSON response({ foo : bar })
打印(响应.内容)
b{foo: bar}
默认情况下,只能传递字典类型。如果要传递非字典类型,需要设置safe keyword参数。
response=JsonResponse([1,2,3],safe=False)
Django快捷函数的官方文档
渲染()
将给定的模板与给定的上下文字典组合,并返回呈现的HttpResponse对象。
参数:
请求:用于生成响应的请求对象。
Template_name:要使用的模板的全名,可选参数。
上下文:添加到模板上下文中的字典。默认情况下是一个空字典。如果字典中的值是可调用的,视图将在呈现模板之前调用它。
Content_type:用于生成的文档的MIME类型。DEFAULT_CONTENT_TYPE的值集。默认为“文本/html”
状态:回应的状态代码。默认值为200。
使用:用于加载模板的模板引擎的名称。一个简单的例子:
从django.shortcuts导入渲染
定义我的视图(请求):
#视图的代码写在这里
render (request, myapp/index.html ,{foo: bar})上面的代码等于:
从django.http导入HttpResponse
来自django.template导入加载程序
定义我的视图(请求):
#视图代码写在这里
t=loader . get _ template( myapp/index . html )
c={foo: bar}
返回HttpResponse(t.render(c,request))
redirect()参数可以是:
一个模型:它会调用模型的get_absolute_url()函数,一个带参数的视图:它会使用urlresolvers.reverse反向解析绝对或相对url的名称,并使用完整的URL作为重定向的位置。默认情况下,返回临时重定向;传递permanent=True可以返回永久重定向。
示例:
您可以以多种方式使用redirect()函数。
传递一个具体的ORM对象(只要知道就行)
具体ORM对象的get_absolute_url()方法将被调用来获取重定向的url:
快捷方式导入重定向
定义我的视图(请求):
.
object=MyModel.objects.get(.)
返回重定向(对象)
传递视图的名称。
定义我的视图(请求):
.
Return redirect (some-view-name ,foo= bar )传递要重定向到的特定URL。
定义我的视图(请求):
.
返回重定向(/some/url/)当然也可以是完整的url。
定义我的视图(请求):
.
返回重定向( 3358example.com/)默认情况下,redirect()返回临时重定向。上述所有表单都接收一个永久参数;如果设置为True,将返回永久重定向:
定义我的视图(请求):
.
object=MyModel.objects.get(.)
返回重定向(object,permanent=True)
延伸阅读:
对于普通用户来说,临时重定向(响应状态代码:302)和永久重定向(响应状态代码:301)没有区别。主要是针对搜索引擎的机器人。
A页暂时重定向到B页,搜索引擎收录A页。
页面a永久重定向到页面B,然后搜索引擎包括页面B.
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。