目录
一、概述
Django 中的视图主要用来接受 Web 请求,并作出响应,视图的本质就是一个 Python 中的函数。
1、视图的响应分为两大类
-
以 Json 数据形式返回(JsonResponse)
-
以网页的形式返回
1)重定向到另一个网页(HttpResponseRedirect)
2)错误视图(4xx,5xx)
2、视图响应过程
浏览器 => urls路由匹配 => 视图响应 => 回馈到浏览器
3、视图参数有两种
-
一个 HttpRequest 的实例,一般命名为 request,相当于从浏览器传过来
如下案例,视图函数中的 request 就是一个形式参数,包含来自客户端的所有请求信息。
pyfrom django.shortcuts import render from book.models import * # 书籍首页 def book_index(request): return render(request, 'book/book_index.html')
-
另一个是自定义参数,一般通过 url 正则表达式传递过来
如:视图函数自定义 bid 参数,该参数就需要从 url 中传递过来。
pyfrom django.shortcuts import render from book.models import * # 书籍详情 def book_detail(request, bid): # 获取bid对应的书籍 book = Book.objects.get(pk=bid) # 组织数据 context = { 'book': book } return render(request, 'book/book_detail.html', context)
因此,我们在 url 路由配置时,就需要定义与视图函数一致的参数。
pyfrom django.urls import path from book.views import * urlpatterns = [ path('index/', book_index, name='index'), path('list/', book_list, name='list'), path('detail/<int:bid>', book_detail, name='detail'), ]
那这个参数怎么获取呢?手动输入?那肯定不是,而是通过数据库的增删改查来获取具体的参数,并传入,如下案例。
py<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>作者</title> </head> <body> <h2>作者详情页</h2> <hr> <p>作者姓名:{{ author.first_name }}{{ author.last_name }}</p> <p>作者邮箱:{{ author.email }}</p> <p>作者性别:{{ author.gender }}</p> <h4>我的其他作品</h4> <ul> {% for book in author.book_set.all %} <li> <a href="{% url 'book:detail' book.id %}"> {{ book.title }} </a> </li> {% endfor %} </ul> </body> </html>
其案例中
book.id
就是要传入的参数!
4、视图函数所在位置
通常在 APP 应用下的 views.py 中定义视图函数。
二、测试
那我们打印一下视图函数中 request 参数,看看会输出什么内容。
1、视图函数
py
def test(request):
print(request)
return HttpResponse('ok')
2、路由
子路由
py
from django.urls import path
from user.views import index, test
urlpatterns = [
path('user/', index, name='index'),
path('request/', test, name='test'),
]
3、访问
4、查看结果
即返回了 <WSGIRequest: GET '/request/'>
请求对象。
你只需要记住 request 就是一个 HttpResponse 对象即可。
三、属性和方法
服务器收到 Http 请求后,会根据报文创建 HttpRequest 对象,视图函数中的第一个参数 request
就是 HttpRequest 对象,django 框架收到 http 请求后会将 http 请求包装为 HttpRequest 对象,之后传递给视图函数。
那 request
这个 HttpRequest 对象有哪些属性和方法呢?
1、属性
-
path:返回 HTTP 请求的 URL 完整路径;
注意并不是整个网址,而是路由地址,如果你要获取路由地址及后面的参数可使用
get_full_path()
来获取。 -
method:返回 HTTP 请求的方法,如 GET、POST 等;
-
GET:返回类似字典类型的参数,包含了 GET 请求的所有参数;
-
POST:返回类似字典类型的参数,包含了 POST 请求的所有参数;
-
COOKIES:类似字典,包含了所有 COOKIE;
-
SESSION:类似字典,表示会话;
-
META['REMOTE_ADDR']:获取客户端的 IP 地址,注意
REMOTE_ADDR
不要写错了。
2、方法
- is_ajax():判断是否是 ajax(),通常用在移动端和 JS 中;
- get_full_path():返回包含参数字符串的请求路径。
四、案例
1、视图函数
py
def my_request(request):
print(request)
# 属性
print(request.path) # 获取请求URL路径
print(request.method) # 获取请求方法,GET、POST、...
print(request.GET) # 获取GET请求的参数(以类似字典的形式)
print(request.GET['name']) # 获取GET请求具体的参数值,但是name如果不存在则会报错,如果有多个name参数,只返回只有一个参数值
print(request.GET.get('name', default='匿名用户')) # 获取GET请求具体的参数值,name如果不存在则不会报错,而会返回None值或你自定义的default值,如果有多个name参数,只返回只有一个参数值
print(request.GET.getlist('name')) # 会以列表的形式返回你指定的所有参数的值,如果有多个name参数,那这些参数的值都会被获取
print(request.POST) # 获取POST请求的参数(以类似字典的形式),如果不是POST请求,则返回{}空字典
print(request.COOKIES) # COOKIE会话技术
print(request.session) # session会话技术
print(request.FILES) # 获取前端上传的文件对象
print(request.META['REMOTE_ADDR']) # 获取客户端IP地址
return HttpResponse('ok')
2、路由
py
from django.urls import path
from user.views import index, my_request
urlpatterns = [
path('user/', index, name='index'),
path('request/', my_request, name='my_request'),
]
3、请求
http://127.0.0.1:8000/request/?name=lisi\&age=18\&name=zhangsan\&age=55
4、结果
5、浏览器如何查看会话(以谷歌浏览器为例)
---END