Django:视图
<h1 style="text-align: center">Django的View(视图) 一,一个简单的视图 from django.http import HttpResponse import datetime <div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a title="复制代码"> <img src="https://www.52php.cn/res/2019/02-25/18/51e409b11aa51c150090697429a953ed.gif" alt="复制代码"> 让我们来逐行解释下上面的代码:
Django使用请求和响应对象来通过系统传递状态。 当浏览器向服务端请求一个页面时,Django创建一个HttpRequest对象,该对象包含关于请求的元数据。然后,Django加载相应的视图,将这个HttpRequest对象作为第一个参数传递给视图函数。 每个视图负责返回一个HttpResponse对象。 二、CBV和FBV 1,基于函数的view,就叫FBV。
request.method == = request.POST.get(= redirect( render(request,)
2,基于类的view,就叫CBV
django.views <span style="color: #0000ff">class<span style="color: #000000"> AddClass(View):
三、给视图添加装饰器 1,使用装饰器装饰FBV FBV本身就是一个函数,所以和给普通的函数加装饰器无差: inner(*args,**== func(*args,**=(,end_time-<span style="color: #008000">#<span style="color: #008000"> FBV版添加班级
<span style="color: #000000">@wrapper <span style="color: #0000ff">def<span style="color: #000000"> add_class(request): <span style="color: #0000ff">if request.method == <span style="color: #800000">"<span style="color: #800000">POST<span style="color: #800000">"<span style="color: #000000">: class_name = request.POST.get(<span style="color: #800000">"<span style="color: #800000">class_name<span style="color: #800000">"<span style="color: #000000">) models.Classes.objects.create(name=<span style="color: #000000">class_name) <span style="color: #0000ff">return redirect(<span style="color: #800000">"<span style="color: #800000">/class_list/<span style="color: #800000">"<span style="color: #000000">) <span style="color: #0000ff">return render(request,<span style="color: #800000">"<span style="color: #800000">add_class.html<span style="color: #800000">") 2,使用装饰器装饰CBV 类中的方法与独立函数不完全相同,因此不能直接将函数装饰器应用于类中的方法 ,我们需要先将其转换为方法装饰器。 Django中提供了method_decorator装饰器用于将函数装饰器转换为方法装饰器。
django.views django.utils.decorators <span style="color: #0000ff">class<span style="color: #000000"> AddClass(View):
<span style="color: #0000ff">class <span style="color: #000000"> Login(View):
四,request对象 1,请求相关的常用值
2,属性 所有的属性应该被认为是只读的,除非另有说明 0.HttpRequest.scheme
表示请求方案的字符串(通常为http或https) 1<span style="color: #000000">.HttpRequest.body 一个字符串,代表请求报文的主体。在处理非 HTTP 形式的报文时非常有用,例如:二进制图片、XML,Json等。 但是,如果要处理表单数据的时候,推荐还是使用 HttpRequest.POST 。 另外,我们还可以用 python 的类文件方法去操作它,详情参考 HttpRequest.read() 。 2<span style="color: #000000">.HttpRequest.path 一个字符串,表示请求的路径组件(不含域名)。 例如:<span style="color: #800000">"<span style="color: #800000">/music/bands/the_beatles/<span style="color: #800000">" 3<span style="color: #000000">.HttpRequest.method 一个字符串,表示请求使用的HTTP 方法。必须使用大写。 例如:<span style="color: #800000">"<span style="color: #800000">GET<span style="color: #800000">"、<span style="color: #800000">"<span style="color: #800000">POST<span style="color: #800000">" 4<span style="color: #000000">.HttpRequest.encoding 一个字符串,表示提交的数据的编码方式(如果为 None 则表示使用 DEFAULT_CHARSET 的设置,默认为 <span style="color: #800000">'<span style="color: #800000">utf-8<span style="color: #800000">'<span style="color: #000000">)。 5<span style="color: #000000">.HttpRequest.GET 一个类似于字典的对象,包含 HTTP GET 的所有参数。详情请参考 QueryDict 对象。 6<span style="color: #000000">.HttpRequest.POST 一个类似于字典的对象,如果请求中包含表单数据,则将这些数据封装成 QueryDict 对象。 POST 请求可以带有空的 POST 字典 —— 如果通过 HTTP POST 方法发送一个表单,但是表单中没有任何的数据,QueryDict 对象依然会被创建。 另外:如果使用 POST 上传文件的话,文件信息将包含在 FILES 属性中。 7<span style="color: #000000">.HttpRequest.COOKIES 一个标准的Python 字典,包含所有的cookie。键和值都为字符串。 8<span style="color: #000000">.HttpRequest.FILES 一个类似于字典的对象,包含所有的上传文件信息。 注意,FILES 只有在请求的方法为POST 且提交的 上传文件示例
request.method ==
filename = request.FILES[
with open(filename,
chunk request.FILES[
HttpResponse(上传文件示例代码
3,方法 1 根据从HTTP_X_FORWARDED_HOST(如果打开 USE_X_FORWARDED_HOST,默认为False)和 HTTP_HOST 头部信息返回请求的原始主机。
如果这两个头部没有提供相应的值,则使用SERVER_NAME 和SERVER_PORT,在PEP 3333<span style="color: #000000"> 中有详细描述。 USE_X_FORWARDED_HOST:一个布尔值,用于指定是否优先使用 X-Forwarded-<span style="color: #000000">Host 首部,仅在代理设置了该首部的情况下,才可以被使用。 例如:<span style="color: #800000">"<span style="color: #800000">127.0.0.1:8000<span style="color: #800000">"<span style="color: #000000"> 注意:当主机位于多个代理后面时,get_host() 方法将会失败。除非使用中间件重写代理的首部。 2<span style="color: #000000">.HttpRequest.get_full_path() 返回 path,如果可以将加上查询字符串。 例如:<span style="color: #800000">"<span style="color: #800000">/music/bands/the_beatles/?print=true<span style="color: #800000">" 3.HttpRequest.get_signed_cookie(key,default=RAISE_ERROR,salt=<span style="color: #800000">'',max_age=<span style="color: #000000">None) 返回签名过的Cookie 对应的值,如果签名不再合法则返回django.core.signing.BadSignature。 如果提供 default 参数,将不会引发异常并返回 default 的值。 可选参数salt 可以用来对安全密钥强力攻击提供额外的保护。max_age 参数用于检查Cookie 对应的时间戳以确保Cookie 的时间不会超过max_age 秒。
4<span style="color: #000000">.HttpRequest.is_secure() 如果请求时是安全的,则返回True;即请求通是过 HTTPS 发起的。 5<span style="color: #000000">.HttpRequest.is_ajax() 如果请求是通过XMLHttpRequest 发起的,则返回True,方法是检查 HTTP_X_REQUESTED_WITH 相应的首部是否是字符串<span style="color: #800000">'<span style="color: #800000">XMLHttpRequest<span style="color: #800000">'<span style="color: #000000">。 大部分现代的 JavaScript 库都会发送这个头部。如果你编写自己的 XMLHttpRequest 调用(在浏览器端),你必须手工设置这个值来让 is_ajax() 可以工作。 如果一个响应需要根据请求是否是通过AJAX 发起的,并且你正在使用某种形式的缓存例如Django 的 cache middleware, 请求相关方法 注意:键值对的值是多个的时候,比如checkbox类型的input标签,select标签,需要用: request.POST.getlist("hobby")
五,response对象 与由Django自动创建的HttpRequest对象相比,HttpResponse对象是我们的职责范围了。我们写的每个视图都需要实例化,填充和返回一个HttpResponse。 HttpResponse类位于django.http模块中。 1,使用 传递字符串 from django.http import HttpResponse
response = HttpResponse("Here's the text of the Web page.")
response = HttpResponse("Text only,please.",content_type="text/plain")
设置或删除响应头信息 response = HttpResponse()
response['Content-Type'] = 'text/html; charset=UTF-8'
del response['Content-Type']
2,属性 HttpResponse.content:响应内容 HttpResponse.charset:响应内容的编码 HttpResponse.status_code:响应的状态码 六,JsonResponse对象 sonResponse是HttpResponse的子类,专门用来生成JSON编码的响应。 from django.http import JsonResponse
response = JsonResponse({'foo': 'bar'}) b'{"foo": "bar"}' 默认只能传递字典类型,如果要传递非字典类型需要设置一下safe关键字参数。 response = JsonResponse([1,2,3],safe=False)
七,Django shortcut functions 1,render 参数: request: 用于生成响应的请求对象。
?可以返回一个永久的重定向。
?函数。 传递一个具体的ORM对象(了解即可) 将调用具体ORM对象的?方法来获取重定向的URL: from django.shortcuts import redirect
def my_view(request): 传递一个视图的名称 def my_view(request):
...
return redirect('some-view-name',foo='bar')
传递要重定向到的一个具体的网址 def my_view(request):
...
return redirect('/some/url/')
当然也可以是一个完整的网址 def my_view(request):
...
return redirect('http://example.com/')
默认情况下,?返回一个临时重定向。?参数;,将返回一个永久的重定向: def my_view(request):
...
object = MyModel.objects.get(...)
return redirect(object,permanent=True)
扩展阅读:? 临时重定向(响应状态码:302)和永久重定向(响应状态码:301)对普通用户来说是没什么区别的,它主要面向的是搜索引擎的机器人。 A页面临时重定向到B页面,那搜索引擎收录的就是A页面。 A页面永久重定向到B页面,那搜索引擎收录的就是B页面 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |