Django在以post的方式提交表单时会出现:
解决方法一(不建议):
屏蔽CSRF
在settings.py文件中将'django.middleware.csrf.CsrfViewMiddleware'注释掉即可
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', #'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
解决方法二(建议):
在表单下面添加 {% csrf_token %}
<form action="{% url 'reg' %}" method="post"> 姓名<input type="text" name="username"><br> 密码<input type="text" name="psw"><br> <input type="submit"> {% csrf_token %} </form>
即可成功提交
这其实是Django提供一个防止跨站攻击的安全机制,看一下浏览器解析的源码
<form action="/blog/register/" method="post"> 姓名<input type="text" name="username"><br> 密码<input type="text" name="psw"><br> <input type="submit"> <input type='hidden' name='csrfmiddlewaretoken' value='0b0Q83GPpMZMYkSWCKPGnYmRpSkwWUv11gPIPHdyGvSpbQIjJiIzBPeH1AYLBXPT' /> </form>
多了一个隐藏的input标签,当在浏览器向django服务端发送get请求时,django会额外响应一对密钥,可以看作由它生成{% csrf_token %},当以post的方式提交表单时,django会检查密钥,因为没写{% csrf_token %},导致没有密钥,所以会报错