Django框架详细介绍---request对象

时间:2021-09-24 10:16:04

几个重要的函数

1.HttpRequest.get_host()

  根据从HTTP_X_FORWARDED_HOST(如果打开 USE_X_FORWARDED_HOST,默认为False和 HTTP_HOST 头部信息返回请求的原始主机。如果这两个头部没有提供相应的值,则使用SERVER_NAME 和SERVER_PORT,在PEP 3333 中有详细描述

  USE_X_FORWARDED_HOST是一个布尔值,用于指定是否优先使用 X-Forwarded-Host 首部,仅在代理设置了该首部的情况下,才可以被使用。   

示例:

"127.0.0.1:8000"

注意:

  当主机位于多个代理后面时,get_host() 方法将会失败。除非使用中间件重写代理的首部

2.HttpRequest.get_full_path()

  获取当前URL从主机或者端口的第一个"/"到URL末尾的字符串

示例:

URL:
    http://127.0.0.1:8000/login/?next=/book_list/
获取结果:
    /login/?next=/book_list/

用法:

  从一个视图跳转到另外一个视图时,在URL后通过key-value的形式拼接成跳转后的URL,这样子结合get_full_path()和request.GET.get("key")获取到跳转前的URL并跳转回去

示例:在访问某个页面时,如未进行登录认证先跳转到登录界面完成认证再跳转到指定页面

<!--request.get_full_path 获取拼接得到的URL-->
<form action="{{ request.get_full_path }}" method="post">
    {% csrf_token %}
    <p>用户名:<input type="text" name="username"></p>
    <p>密码:<input type="password" name="pwd"></p>
    <p><input type="submit" value="登录"></p>
    <p style="color: red">{{ err_msg }}</p>
</form>

访问图书列表时需要先登录:

def book_list(request):
    # 判断请求里是否有键值对,也就是验证是否登录
    login_flag = request.get_signed_cookie("login", default="", salt="jiayanchuli")
    # 查看获取收到的是什么
    print(login_flag)
    if login_flag == "ok":
        # 查找出所有书籍
        books = models.Book.objects.all()
        # 统计书籍数量
        total_num = books.count()
        # 从url中提取出来当前访问的具体页码
        current_page = request.GET.get("page")
        from utils import mypage
        page_obj = mypage.Page(total_num, current_page, 'book_list')
        # 当前页码应该展示的书籍数据
        books_list = books[page_obj.data_start:page_obj.data_end]
        # 生成分页的页码
        page_html = page_obj.page_html()
        # 在页面上展示出来
        return render(request,
                      "book_list.html",
                      {"book_list": books_list,
                       "page_html": page_html},
                      )
    # 获取当前访问的URL
    url = request.path_info
   # 拼接URL,并跳转
return redirect("/login/?next={}".format(url))

登录视图上:

def login(request):
    if request.method == "POST":
        username = request.POST.get("username")
        password = request.POST.get("pwd")
        user_obj = models.User.objects.filter(username=username, password=password)
        if user_obj:
       # 通过get("key"),获取登录前跳转到的URL
            url = request.GET.get("next")
            print(url)
            rep = redirect(url)
            rep.set_signed_cookie("login", "ok", salt="jiayanchuli")
            return rep
        else:
            return render(request,
                          "login.html",
                          {"err_msg": "用户名或密码错误"})
    return render(request, "login.html")

3.HttpRequest.get_path_info()

  获取到主机或者端口号之后第一个"/"与问号之间的字符串

URL:
    http://127.0.0.1:8000/login/?next=/book_list/
获取结果:
    /login/

4.HttpRequest.build_absolute_uri(location)

  获取location的绝对URL,如果没有提供该参数则默认使用get_full_path()的返回值,如果URI已经是一个绝对URI,则将不会修改,否则将使用请求中的服务器相关的变量构成绝对URI

URL:
    http://127.0.0.1:8000/login/?next=/book_list/
获取结果:
    http://127.0.0.1:8000/login/?next=/book_list/

5.HttpRequest.get_signed_cookie(key, default=RAISE_ERROR, salt="", max_age=None)

  返回签名的Cookie对应的值,如果签名不再合法则返回django.core.signing.BadSignature,如果提供了default参数,将不会引发异常并返回该默认值

  可选参数salt,可用来第安全密钥进行加盐提高安全度,max_age参数用来检查Cookie对应的时间戳以确保Cookie的时间不会超过max_age(单位:秒)

 

相关文章