Django 视图函数
Django 是一个开放源代码的 Web 框架,使用 Python 编写。Django 奉行着 DRY(Don't Repeat Yourself)原则,提供了快速高效的开发方式。其中的视图函数是 Django 中重要的组成部分之一。
1. 什么是视图函数
视图函数(View Function)是 Django 中处理 Web 请求和返回 Web 响应的函数。它接收一个 Web 请求,将其处理并返回一个 Web 响应。一个 Web 请求是由客户端发送给 Web 服务器的 HTTP 请求,并且包含了请求方法、URL、请求头、请求体等信息。Web 服务器接收到 HTTP 请求后,将其转发给 Django 应用,再由 Django 应用中的路由系统根据 URL 匹配到对应的视图函数进行处理。
视图函数返回的 Web 响应是由 Web 服务器发送给客户端的 HTTP 响应,其中包含响应头、响应体等信息。Web 服务器接收到 Django 应用返回的 Web 响应后,将其转发给客户端。
2. Django 视图函数的代码结构
Django 中的视图函数是一个 Python 函数,代码结构通常如下:
def view_function(request, *args, **kwargs):
# 视图函数的业务逻辑
return response
其中,
- view_function:视图函数的函数名,通常使用小写字母加下划线的方式命名;
- request:是一个 HttpRequest 对象,包含了 Web 请求的所有信息;
- args:是非关键字参数,使用元组形式传递;
- kwargs:是关键字参数,使用字典形式传递;
- response:是一个 HttpResponse 对象,包含了 Web 响应的所有信息。
3. 视图函数的参数
视图函数接收一个参数 request,这是一个 HttpRequest 对象,包含了 Web 请求的所有信息。除了 request 外,视图函数可以接收其他参数,通常以 URL 中的变量或关键字参数的形式出现。
3.1. URL 中变量的传递方式
Django 通过 URL 中的变量来传递参数。通常有两种方式:
- 使用位置变量,如 /book/1/;
- 使用关键字变量,如 /book/?id=1。
使用位置变量传递参数时,视图函数将以位置参数的方式接收参数。如下所示:
# urls.py
from django.urls import path
from . import views
urlpatterns = [
path('book//', views.book_detail, name='book_detail'),
]
# views.py
def book_detail(request, book_id):
# book_id 表示 URL 中的变量,
# 可以当做位置参数使用
return HttpResponse('book id is ' + str(book_id))
使用关键字变量传递参数时,视图函数将以关键字参数的方式接收参数。如下所示:
# urls.py
from django.urls import path
from . import views
urlpatterns = [
path('book/', views.book_detail, name='book_detail'),
]
# views.py
def book_detail(request):
# id 表示关键字变量,
# 可以当做关键字参数使用
book_id = request.GET.get('id')
return HttpResponse('book id is ' + str(book_id))
3.2. 关键字参数的传递方式
视图函数可以通过关键字参数的形式接收请求参数。如下所示:
# urls.py
from django.urls import path
from .views import login
urlpatterns = [
path('login/', login, {'template_name': 'login.html'}, name='login'),
]
# views.py
def login(request, template_name):
# template_name 表示关键字参数,
# 可以当做关键字参数使用
return render(request, template_name)
4. 视图函数的返回值
视图函数处理完成请求后,需要返回一个 HttpResponse 对象作为响应。HttpResponse 对象中包含了要返回给客户端的信息,如响应状态、响应头、响应体等。
视图函数也可以直接返回字符串,Django 会自动将其封装成 HttpResponse 对象。如下所示:
def hello(request):
return 'Hello, World!'
但是,直接返回字符串不够灵活,无法设置响应状态码、响应头等信息。
4.1. HttpResponse 对象
HttpResponse 对象是 Django 中最常用的响应对象,它包含了所有的响应信息。HttpResponse 对象的构造函数如下:
HttpResponse(content='', content_type=None, status=None, reason=None, charset=None)
其中,
- content:表示响应体的内容,默认为空字符串;
- content_type:表示响应体的 MIME 类型,默认为 None;
- status:表示响应状态码,默认为 200;
- reason:表示响应状态码的原因短语,默认为 None;
- charset:表示响应体的字符集,默认为 None。
HttpResponse 对象的属性和方法如下:
- HttpResponse.content:表示响应体的内容;
- HttpResponse.status_code:表示响应状态码;
- HttpResponse.reason_phrase:表示响应状态码的原因短语;
- HttpResponse['header-name']:表示响应头的值;
- HttpResponse.set_cookie():设置 Cookies;
- HttpResponse.delete_cookie():删除 Cookies。
4.2. 渲染模板
视图函数除了返回字符串或 HttpResponse 对象外,还可以返回使用模板渲染后的响应。
Django 内置了模板引擎,通过在模板中插入变量、逻辑控制、表达式等动态生成 HTML 的方式来渲染响应。模板中可以使用 Django 的模板语言(Django Template Language)来表达逻辑,比如循环、条件分支、变量等。
渲染模板通常使用 render() 函数,代码如下:
def my_view(request):
context = {'name': 'Jane'}
return render(request, 'my_template.html', context)
其中,
- request:表示 HTTP 请求对象;
- 'my_template.html':表示要渲染的模板名称;
- context:表示要传递给模板的上下文数据,通常为一个字典。
4.3. 重定向
重定向是指将客户端的请求重定向到另一个 URL 地址上,可以使用 redirect() 函数实现。代码如下:
from django.shortcuts import redirect
def my_view(request):
return redirect('https://www.example.com')
redirect() 函数有两个参数:
- to:表示要重定向到的 URL 地址;
- permanent:表示是否使用永久重定向,默认为 False。
5. 总结
Django 中的视图函数是处理 Web 请求和返回 Web 响应的函数,它接收一个 Web 请求,将其处理并返回一个 Web 响应。视图函数通常接收一个名为 request 的参数,表示 HTTP 请求对象。视图函数可以通过位置变量、关键字变量、关键字参数等形式接收请求参数,并且返回 HttpResponse 对象、字符串或渲染后的模板响应。重定向可以使用 redirect() 函数实现。