4-request对象
前端提交数据
必备知识点
前端form表单中action属性,不写默认是当前路由地址
前端form表单中的method属性,不写默认是GET请求
# views.py
def somthing(request):
# request是一个对象,封装了用户发送过来的所有请求相关的数据
# 1.获取请求方式 GET/POST
print(request.method)
# 2.在URL上传递值 /somthing/?n1=123&n2=345
print(request.GET)
# 3.在请求中提交数据
print(request.POST)
# 4.【响应】HttpResponse("返回内容"),内存字符串内容返回给请求者
# return HttpResponse('返回的内容')
# 5.【响应】读取HTML的内容 + 渲染人(替换) -> 字符串,返回给用户浏览器。
# return render(request, 'somthing.html', {'title': '来了'})
# 6.【响应】让浏览器重定向到其它的页面,比如你访问了某个博客网站,这个网站肯定会先给你返回一个东西
# 这个博客网站说我没有,你自己去别的地方吧,然后浏览器向别的地方(重定向的地址)发起的请求
return redirect("https://www.baidu.com")
前端页面
templates\register.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<h1>欢迎登录</h1>
<form action="" method="post">
{# 如果不在此处加上下面这段代码,结果会报错 #}
{% csrf_token %}
请输入姓名:<input type="text" name="name" placeholder="输入姓名">
请输入密码:<input type="password" name="password">
<input type="submit" value="提交">
<span style="color:tomato">{{ error }}</span>
</form>
</body>
</html>
后端页面
# views.py
from django.shortcuts import render, redirect
def register(request):
if request.method == 'GET':
return render(request, 'register.html')
# 如果是POST请求,获取用户提交的数据
username = request.POST.get('name')
password = request.POST.get('password')
if username == '小满' and password == '123':
return redirect("https://www.cnblogs.com/ccsvip")
return render(request, 'register.html', {"error": '用户名或密码错误'})
# views.py
from django.urls import path
from app import views
urlpatterns = [
path('register/', views.register, name='register') # name='register' 表示别名
]
如果不加 {% csrf_token %} 就会报错这个错误
解决方案1,注释掉下面这个配置
# 将settings.py文件中的配置注释掉,在后面的学习中我们会逐步的解决掉这个问题
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',
]
解决方案2,在HTML页面,form表单内部,添加{% scrf_token %}即可解决,参考上面的代码,下面红框就是添加后的网页源码,
登录成功就会自动重定向
request的属性以及方法
<!-- register.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册页面</title>
<style>
fieldset {
width: 300px;
}
legend {
text-align: center;
}
</style>
</head>
<body>
<form action="" method="post">
<fieldset>
<legend>请输入用户名以及密码</legend>
<label for="username">账号:</label>
<input id="username" name="username" type="text" placeholder="在此处输入用户名">
<br>
<label for="password">密码:</label>
<input id="password" name="password" type="password">
<br>
爱好:
<input name="hobby" id="kill" type="checkbox" value="抢人头">
<label for="kill">抢人头</label>
<input name="hobby" id="fish" type="checkbox" value="摸鱼">
<label for="fish">摸鱼</label>
<input name="hobby" id="cut-class" type="checkbox" value="逃课">
<label for="cut-class">逃课</label>
<br>
<input id="hobby" type="submit" value="提交">
</fieldset>
</form>
</body>
</html>
def register(request):
query_dict = request.POST:
username = query_dict.get('username') # 获取单个值
password = query_dict.get('password') # 获取单个值
hobby = query_dict.getlist('hobby') # 获取多个值,一般是用于接收form表单的多选框数据
print(username, password, hobby) # 小满 123 ['抢人头', '摸鱼', '逃课']
return render(request, 'register.html')
QueryDict.dict() 转成纯字典
request.POST.dict()
request.GET.dict()