Django之视图

Posted 无名!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django之视图相关的知识,希望对你有一定的参考价值。

 一个视图函数(类),称之为视图。将视图放置在项目(project)或应用程序(app01) 目录中的名为vie.py文件中。

FBV和FBV

 

FBV  -> 把视图写成一个函数
CBV  -> 把视图写成一个类
        
        FBV:
        def login(request):
            # 在函数中如何区分GET请求和POST请求
            if request.method == "GET":
                # 这是GET请求  -> 获取一个页面
            if request.method == "POST":
                # POST请求     -> 提交数据

CBV 导入基类 from django.views import View class Login(View): def dispatch(self): 在请求前和请求之后执行 hasattr("get") 等到后面讲cookie和session时候再讲(登录) def get(self, request): # 这是GET请求 def post(self, request): # POST请求

Form表单提交数据,三要素:
1. form标签的属性:action=“提交的URL地址”,method=“POST”, 不写method默认是GET请求
2. form表单里面要包含有一个submit按钮
3. input、select(下拉框)、checkbox(单选框)、radio、textarea必须有name属性

 

Request对象

属性:
  django将请求报文中的请求行、头部信息、内容主体封装成 HttpRequest 类中的属性。
除了特殊说明的之外,其他均为只读的。
1.request.method
  一个字符串,表示请求使用的HTTP 方法。必须使用大写。
  例如:"GET"、"POST"
2.request.POST
3.request.GET
4.request.path
  一个字符串,表示请求的路径组件(不含域名)。
  例如:"/music/bands/the_beatles/"
5.request.FILES
  一个类似于字典的对象,包含所有的上传文件信息。
   FILES 中的每个键为<input type="file" name="" /
  enctype="multipart/form-data"> 中的name,值则为对应的数据。   
  注意,FILES 只有在请求的方法为POST 且提交的<form> 带有enctype="multipart/form-data" 的情况下才会 包含数据。
  否则,FILES 将为一个空的类似于字典的对象

Request方法

1.request.get_host()
  例如:"127.0.0.1:8000"
  注意:当主机位于多个代理后面时,get_host() 方法将会失败。除非使用中间件重写代理的首部。
2.request.get_full_path() 
  返回 path,如果可以将加上查询字符串。
  例如:"/music/bands/the_beatles/?print=true"
3.request.get_signed_cookie(key, default=RAISE_ERROR, salt=‘‘, max_age=None)) 

 返回签名过的Cookie 对应的值,如果签名不再合法则返回django.core.signing.BadSignature。

  如果提供 default 参数,将不会引发异常并返回 default 的值。

  可选参数salt 可以用来对安全密钥强力攻击提供额外的保护。max_age 参数用于检查Cookie 对应的时间戳以确保Cookie 的时间不会超过max_age 秒。


4.request.is_ajax()
  如果请求是通过XMLHttpRequest 发起的,则返回True,方法是检查 HTTP_X_REQUESTED_WITH 相应的首部是否是字符串‘XMLHttpRequest‘。

  大部分现代的 javascript 库都会发送这个头部。如果你编写自己的 XMLHttpRequest 调用(在浏览器端),你必须手工设置这个值来让 is_ajax() 可以工作。

  如果一个响应需要根据请求是否是通过AJAX 发起的,并且你正在使用某种形式的缓存例如Django 的 cache middleware, 
   你应该使用 vary_on_headers(‘HTTP_X_REQUESTED_WITH‘) 装饰你的视图以让响应能够正确地缓存。
5.如果POST请求提交过来的数据某一项有多个值:

  比如说:多选的select >option (name写在select上)
            checkbox   (多项时name值一样)

  request.POST.getlist("hobby")

  request.POST 里面没有文件相关内容

示例:

<select name="num" id="" multiple>
<option value="1">一</option>
<option value="2">二</option>
<option value="3">三</option>
</select>

<input name="num2" type="checkbox" value="66">
<input name="num2" type="checkbox" value="88">
<input name="num2" type="checkbox" value="99">

<input type="submit" value="提交">

 

Response对象

与由Django自动创建的HttpRequest对象相比,HttpResponse对象是我们的职责范围了。我们写的每个视图都需要实例化,填充和返回一个HttpResponse。

HttpResponse类位于django.http模块中。

使用

传递字符串

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‘]

属性

HttpResponse.content:响应内容

HttpResponse.charset:响应内容的编码

HttpResponse.status_code:响应的状态码

JsonResponse对象

JsonResponse是HttpResponse的子类,专门用来生成JSON编码的响应。

技术分享图片
from django.http import JsonResponse

response = JsonResponse({‘foo‘: ‘bar‘})
print(response.content)

b‘{"foo": "bar"}‘
技术分享图片

默认只能传递字典类型,如果要传递非字典类型需要设置一下safe关键字参数。

response = JsonResponse([1, 2, 3], safe=False)

Django shortcut functions

官方文档

render()

render(request, template_name[, context])

结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。

其默认的Content-Type标头设置为application/json。

参数:
     request: 用于生成响应的请求对象。

     template_name:要使用的模板的完整名称,可选的参数

     context:添加到模板上下文的一个字典。默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。

     content_type:生成的文档要使用的MIME类型。默认为 DEFAULT_CONTENT_TYPE 设置的值。

     status:响应的状态码。默认为200。

一个简单的例子:
from django.shortcuts import render

def my_view(request):
    # 视图的代码写在这里
    return render(request, ‘myapp/index.html‘, {‘foo‘: ‘bar‘})

上面的代码等于:

技术分享图片
from django.http import HttpResponse
from django.template import loader

def my_view(request):
    # 视图代码写在这里
    t = loader.get_template(‘myapp/index.html‘)
    c = {‘foo‘: ‘bar‘}
    return HttpResponse(t.render(c, request))
技术分享图片

redirect()

参数可以是:

  • 一个模型:将调用模型的get_absolute_url() 函数
  • 一个视图,可以带有参数:将使用urlresolvers.reverse 来反向解析名称
  • 一个绝对的或相对的URL,将原封不动的作为重定向的位置。

默认返回一个临时的重定向;传递permanent=True 可以返回一个永久的重定向。

示例:

你可以用多种方式使用redirect() 函数。

传递一个对象(ORM相关)

将调用get_absolute_url() 方法来获取重定向的URL:

技术分享图片
from django.shortcuts import redirect
 
def my_view(request):
    ...
    object = MyModel.objects.get(...)
    return redirect(object)
技术分享图片

传递一个视图的名称

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/‘)

默认情况下,redirect() 返回一个临时重定向。以上所有的形式都接收一个permanent 参数;如果设置为True,将返回一个永久的重定向:

def my_view(request):
    ...
    object = MyModel.objects.get(...)
    return redirect(object, permanent=True) 

 

以上是关于Django之视图的主要内容,如果未能解决你的问题,请参考以下文章

Django之视图

Django视图层之路由配置系统(urls)

Django之视图

Django之视图层

03.Django基础三之视图函数

Django框架之视图层汇总