Django框架之视图层
一、视图函数
视图函数,简称视图,属于Django的视图层,默认定义在view.py
文件中,是用来处理web请求信息以及返回响应信息的函数,所以研究视图函数只需熟练掌握两个对象即可:请求对象(HTTPRequest)和响应对象(HTTPResponse)
二、请求对象(HTTPRequest)
Django将Http协议请求报文中的请求行、首部信息、内容主体封装到了HTTPRequest对象中(类似我们自定义框架的environ参数)。Django会将HTTPRequest对象当做参数传给视图函数的第一个参数request,在视图函数中,通过访问该对象的属性便可以提取http协议的请求数据
1. request对象常用属性
# request.method
获取请求使用的方法(值为纯大写的字符串格式),例如:"POST"、"GET",应该通过该属性的值来判断请求方法
# request.GET
值为一个类似于字典的QueryDict对象,封装了GET请求的所有参数,可通过HttpRequest.GET.get("键")获取相对应的值
# request.POST
值为一个类似于字典的QueryDict对象,封装了POST请求的所有参数,可通过HttpRequest.POST.get("键")获取相对应的值
三、响应对象(HttpResponse)
响应可以是任何形式的内容,比如一个HTML文件的内容,一个重定向,一个404错误,一个XML文档,或者一张图片等。总之,无论视图本身包含什么逻辑,都要返回响应,具体的说,响应对象主要有三种形式HttpResponse
、render
和redirect
from django.shortcuts import HttpResponse
from django.shortcuts import render
from django.shortcuts import redirect
1. HttpResponse()
括号内直接跟一个具体的字符串作为响应体,比较直接很简单,所以这里主要介绍和面两种形式
2. render()
render(request,template_name[,context])
# 1.request:用于生成响应的请求对象,固定必须传入的第一个参数
# 2.template_name:要使用的模板的完整名称,必须传入,render默认会去templates目录下查找模板文件
# 3.context:可选参数,可以传入一个字典用来替换模块文件中的变量
# 总结:根据给定字典渲染模板文件,并返回一个渲染后的 HttpResponse 对象
3. redirect()
# 返回重定向信息
def my_view(request):
...
return redirect("/some/url/")
# 重定向的地址也可以是一个完整的URL
def my_view(request):
...
return redirect("http://www.baidu.com/")
重定向转态码301与302的区别
一、301 和 302 的异同。
1、相同之处:
301 和 302 状态码都表示重定向,具体点说就是浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址(浏览器会从响应头Location中获取新地址),用户看到的效果都是输入地址A后瞬间跳转到了另一个地址B
2、不同之处:
301 表示旧地址A的资源已经被永久地移除了,即这个资源不可访问了。搜索引擎在抓取新内容的同时也将旧的网址转换为重定向之后的地址;
302 表示旧地址A的资源还在,即这个资源仍然可以访问,这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容、并且会保存旧的网址。 从SEO层面考虑,302要好于301
二、重定向原因:
1、网站调整(如改变网页目录结构);
2、网页被移到一个新地址;
3、网页扩展名改变(如应用需要把.php改成.Html或.shtml)。
这种情况下,如果不做重定向,则用户收藏夹或搜索引擎数据库中旧地址只能让访问客户得到一个404页面错误信息,访问流量白白丧失;再者某些注册了多个域名的网站,也需要通过重定向让访问这些域名的用户自动跳转到主站点等。
四、JsonResponse
json格式的数据有什么用?前后端数据交互需要使用到json作为过渡实现跨语言传输数据
方式一
import json
def my_view(request):
data = ['egon','jason']
return HttpResponse(json.dumps(data))
方式二
from django.http import JsonResponse
def my_view(request):
data = ['egon','jason']
return JsonResponse(data,safe=Faslse)
# 默认 safe=True 代表只能序列化字典对象,safe=False 代表可以序列化字典以外的对象
五、FBV 和 CBV
Django 的视图层由两种形式构成,FBV 和 CBV
- FBV 基于函数的视图(Function Base View)
- CBV 基于类的视图(Class Base View)
url.py
from django.urls import path,register_converter,re_path
from app01 import views
urlpatterns = [
re_path(r'^login/',views.LoginView.as_view()), # 必须调用类下的方法 as_view
]
view.py
from django.shortcuts import render,HttpReponse,redirect
from django.views import View
class LoginView(View):
def dispath(self,request,*args,**kwargs): # 可在该方法内做一些预处理操作
# 当请求 url:http://127.0.0.1:8080/login 会先触发 dispatch 的执行
# 如果 http 协议的请求方式为 GET,则调用下述 get 方法
# 如果 http 协议的请求方式为 POST,则调用下述 post 方法
obj = super().dispatch(request,*args,**kwargs) # 必须继承父类的 dispatch 功能
return obj # 必须返回 obj
def get(self,request):
return render(request,'login.html')
def post(self,request):
username = request.POST.get("name")
password = request.POST.get("password")
if username == 'egon' and password == '123':
msg = '登录成功'
else:
msg = '用户名或密码错误'
return HttpResponse(msg)
测试
python manage.py runserver 8001
# 验证 GET 请求:在浏览器输入 http://127.0.0.1:8001/login/
# 验证 POST 请求:在表单内输入数据然后提交
采用 CBV 可以引入面向对象的思想对数据进行更高程度的封装,此处简单了解即可