Request

Django 框架在收到 web 客户端请求的时候,会先判断请求的 url,通过 urls.py 路由文件把该 url 映射到视图函数,然后执行视图函数的一系列操作,返回给客户端一个 response。在前文中也已经定义过一些很简单的视图函数,容易发现它们都必须携带一个参数 request(当然你可以任意起名,叫 request 只是因为传入的对象是一个 WSGIRequest)。

这个 request 变量自带了一堆属性,例如 method、GET、POST、user、session 等。

其中通过 request.method 可以判断请求的方法,当请求方法为 GET 时,request.GET 会返回一个 QueryDict 对象(和字典类似),其包含了该次请求的所有 GET 参数;POST 方法同理。

request.user 可以获得一个 User 对象,为当前登录的用户,以后讲到登录功能时再提。

Form

表单通常用于发起 POST 请求(当然也可以 GET),以下举一个 django 框架中表单的例子。

首先,在 templates 文件夹下放一个 form.html,写入一个简单的登录表单:

markup
<!DOCTYPE html>
<html>
<head>
	<title>form</title>
</head>
<body>
	<form action="#" method="POST">
		<input type="text" name="username" required>
		<input type="password" name="password" required>
		<input type="submit">
	</form>
</body>
<!-- 用于接收后端发来的message -->
{% if messages %}
     {% for message in messages %}
         <script>alert('{{ message }}');</script>
     {% endfor %}
{% endif %}
</html>

helloworld 文件夹下的 urls.py 中在 urlpatterns 列表添加一项:

python
path('login/', views.mylogin),

views.py 添加导入与函数:

python
from django.contrib import messages

def mylogin(request):
	if request.method == 'GET':
		return render(request, 'form.html')
        # 键取的是html中表单组件的name
	username = request.POST.get('username')
	password = request.POST.get('password')
	if username == 'admin' and password == 'adminpwd':
		messages.success(request, '登录成功!')
	else:
		messages.warning(request, '用户名或密码错误!')
	return render(request, 'form.html')

然后我们将项目运行在本地 80 端口,并访问 http://127.0.0.1/login/,可以看到一个充满了简约风的表单页面,填入 admin 和 adminpwd 并提交即可。

提交以后网页显示

raw
Forbidden (403)
CSRF verification failed. Request aborted.
...

这是说表单在提交时缺少 CSRFtoken,是 django 默认带有的一种保护机制(正所谓防君子不防小人系列)。

解决这个问题有两种方法:

  • 找到 settings.py 文件大约第 42 行,MIDDLEWARE 参数中将第四项 django.middleware.csrf.CsrfViewMiddleware 注释掉。
  • 在 html 表单里面添加 {% csrf_token %}

这样就可以正常将提交到后端进行处理了。