7.Django(django请求流程、请求对象、响应对象、状态码、重定向原因)

views视图函数

创建一个新的项目:viewstest

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页面错误信息,访问流量白白丧失;再者某些注册了多个域名的网站,也需要通过重定向让访问这些域名的用户自动跳转到主站点等。

 

posted @ 2020-05-19 10:44  牧羊小董  阅读(763)  评论(0)    收藏  举报