7.Django(django请求流程、请求对象、响应对象、状态码、重定向原因)
Django的请求流程:
浏览器向服务端发送请求一个页面的请求(请求行、请求头部、空行、请求数据),Django服务端接收到浏览器的这个请求并且将和这个请求封装成HttpRequest对象,然后通过Django的url路由分发系统,匹配对应的路径,执行相应的views视图函数中的函数,并且将HttpReuqest对象传递给函数的第一个参数request,在函数中执行相应的逻辑可能会与数据库进行交互,然后通过render模板系统将数据库中的数据与html页面结合或者是形成一个字符串,最后交由return返回给浏览器一个HttpResponse对象,浏览器接收到HttpResponse对象经过内核渲染,呈现用户面前。
请求对象
研究请求对象,分get请求和post请求分别研究。
-
get请求
def index(request):
if request.GET:
# print(request.method) # 获取请求方式 返回'Get' 或 'POST'
# print(request.GET) # 获取get请求提交的数据 <QueryDict: {'username': ['牧羊小董'], 'password': ['123']}>
# print(request.GET.get('username')) # 获取用户名
# print(request.GET.get('password')) # 获取密码
# print(request.GET.getlist('hobby')) # 获取多选框以及select等多个值
# print(request.path) # 获取路径
# print(request.path_info) # 获取路径
# print(request.get_full_path()) # 获取请求的路径以及参数 /index/?username=%E8%91%A3%E4%BC%9F%E5%8D%8E&password=123
# print(request.body) # 获取请求数据 get请求的请求数据为空
# print(request.META) # 获取请求头部的所有信息
# print(request.is_ajax()) # 判断是不是ajax发送的请求,True 和 False
return render(request, 'index.html') -
post请求‘
def index(request):
if request.GET:
# print(request.method) # 获取请求方式 返回'Get' 或 'POST'
# print(request.POST) # 获取post提交的数据
# print(request.POST.get('username')) # 获取用户名
# print(request.POST.getlist('hobby')) # 获取多选框以及select等多个值
# print(request.path_info) # 获取路径
# print(request.body) # 获取请求数据 get请求的请求数据为空
# print(request.META) # 获取请求头部的所有信息
return render(request, 'index.html')
重点总结:
1、print(request.method) # 获取请求方式 返回'Get' 或 'POST'
2、print(request.GET) # 获取get请求提交的数据 <QueryDict: {'username': ['董伟华'], 'password': ['123']}>
3、print(request.GET.getlist('hobby')) # 获取多选框以及select等多个值
4、print(request.POST) # 获取post提交的数据
5、print(request.POST.getlist('hobby')) # 获取多选框以及select等多个值
6、print(request.path) # 获取路径
7、print(request.body) # 获取请求数据 get请求的请求数据为空
8、print(request.META) # 获取请求头部的所有信息
响应对象
响应对象就是views函数返回给浏览器的一个HttpResponse对象,响应对象分三类:
1、httpresponse 给浏览器返回一个字符串
2、render 给浏览器返回一个html页面
3、redirect 跳转页面
测试一下httpresponse以及render
views:
# return HttpResponse('访问成功了!!!')
return render(request, 'index.html', {'name': '牧羊小董'})
index.html:
<h1>欢迎{{ name }}光临plus会所</h1>
-
redirect 跳转页面
返回给前端一个30x的状态码,用于跳转页面
什么时候需要跳转页面?
1、我们登陆一个网站,登陆时是一个页面,当我们登陆成功后,自动跳转网站的首页。
2、原网站由于不可描述等原因不能再访问了,当你在访问原页面的时候就会跳转到一个新页面,进行观看。
3、原网站不能再更新了,由于各种程序员“完美的”更新,导致不能再更新了,只能重新在写一个页面了,只能重定向一个新页面。老用户只知道你的原网址,不知道新的。
我们做一个实例:登录成功之后,跳转首页的实例。
-
非跳转的
urls:
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/', views.login),
url(r'^home/', views.home),
]views:
from django.shortcuts import render
# Create your views here.
def login(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
if username == '牧羊小董' and password == '123':
return render(request, 'home.html')
return render(request, 'login.html')
def home(requese):
return render(requese, 'home.html')
html:
login.html页面代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>请先登录</h1>
<form action="" method="post">
用户名:<input type="text" name="username">
<p></p>
密码:<input type="password" name="password">
<p></p>
<input type="submit">
</form>
</body>
</html>
home.html页面代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>欢迎光临</h1>
<h3>您已经登录成功</h3>
</body>
</html>
非跳转的:在原网址下返回首页html
-
跳转版本:
urls:
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/', views.login),
url(r'^home/', views.home),
]views:
from django.shortcuts import render # Create your views here. def login(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') if username == '牧羊小董' and password == '123': return redirect('/home/') return render(request, 'login.html') def home(requese): return render(requese, 'home.html')
html:
login.html页面代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>请先登录</h1> <form action="" method="post"> 用户名:<input type="text" name="username"> <p></p> 密码:<input type="password" name="password"> <p></p> <input type="submit"> </form> </body> </html> home.html页面代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>欢迎光临</h1> <h3>您已经登录成功</h3> </body> </html>
第一次127.0.0.1:8000/login get请求 请求到了loginyem
第二次点击提交 127.0.0.1:8000/login post请求 返回给页面一个30x的状态码,并且返回给页面一个rediect指令,这个指令就是location:路径,告诉浏览器你在向127.0.0.1:8000/home这个url发送一个请求,
然后浏览器接收到redirect的指令想127.0.0.1:8000/home这个url发送一个请求,请求到了home.html
redirect为什么能让浏览器再次发出请求?因为这个指令其实内部就是location.href='网址'
redirect可以返回重定向的状态码301,302
状态码
状态码301与302的区别?
301与302状态码都代表着重定向
301是永久重定向,原来的网址以及对应的页面、资源都不能访问了,重定向到新的网页。
302是临时重定向,原来的网址以及对应的页面、资源都还在还可以访问,然后重定向到新页面(比如登录跳转)
重定向原因
1、网站调整(如改变网页目录结构) 2、网页被移带一个新地址 3、网页扩展改名(如应用需要把.php改成.html或.shtml) 这种情况下,如果不做重定向,则用户收藏夹或搜索引擎数据库中旧地址只能访问客户得到一个404页面错误信息,访问流量白白丧失;再者某些注册了多个域名的网站,也需要通过重定向让访问这些域名的用户自动跳转到主站点等。