Django 中的视图主要用来接受 Web 请求,并作出响应,视图的本质就是一个 Python 中的函数。
1、视图的响应分为两大类
以 Json 数据形式返回(JsonResponse)
以网页的形式返回
1)重定向到另一个网页(HttpResponseRedirect)
2)错误视图(4xx,5xx)
2、视图响应过程
浏览器 => urls路由匹配 => 视图响应 => 回馈到浏览器
3、视图参数有两种
一个 HttpRequest 的实例,一般命名为 request,相当于从浏览器传过来
如下案例,视图函数中的 request 就是一个形式参数,包含来自客户端的所有请求信息。
from django.shortcuts import render
from book.models import *
# 书籍首页
def book_index(request):
return render(request, 'book/book_index.html')
另一个是自定义参数,一般通过 url 正则表达式传递过来
如:视图函数自定义 bid 参数,该参数就需要从 url 中传递过来。
from 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 路由配置时,就需要定义与视图函数一致的参数。
from 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'),
]
那这个参数怎么获取呢?手动输入?那肯定不是,而是通过数据库的增删改查来获取具体的参数,并传入,如下案例。
<!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、视图函数
def test(request):
print(request)
return HttpResponse('ok')
2、路由
子路由
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、方法
1、视图函数
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、路由
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