python入门 django 入门(三) request、session、response、cookie等操作

     阅读:24

免费分享,平时搬砖,周末会录制匹配的视频。
配套视频地址:https


接着上篇博客的项目,今天继续学习django的视图, 只考虑前后端分离模式也就是只返回json数据,其它的请自学习

在这里插入图片描述

其中view就是python的视图,v层,核心的代码逻辑都是写在view中

测试项目需要用到postman,下载:

链接:https://pan.baidu.com/s/1yMSKdXBi7kCffJb6VAi_9w  提取码:35sy 

1.小demo入门

流程应该很清晰,就是根据在浏览器或者小程序等输入一个url(可以传递参数)----根据url映射到对应的方法代码(获取请求参数)----根据参数去models层查询数据库获得数据----返回给调用者

首先要处理的就是url映射

在这里插入图片描述

整个项目的总urls配置:包名同名的urls

from django.contrib import admin
from django.urls import path, re_path, include  # 1.导入re_path(正则表达式) 2.include(为了引入其它urls)

urlpatterns = [
    path('admin/', admin.site.urls),
    # r表示里面写的正则表达式  ^表示匹配任意 表示字符串不转义,这样在正则表达式中使用 \ 只写一个就可以
    # 因为一个项目里面有很多应用 比如pay 物流等 为了避免冲突 每个应用的url映射 写在自己的urls里面
    # 为每个路径改命名空间,逻辑隔离 方便后续管理
    re_path(r'^', include(("pay.urls", "pay"), namespace="pay")),
]

当访问任意路径会,进入pay.urls pay.urls配置

from django.contrib import admin
from django.urls import path, re_path, include
from .views import goodlist  # .表示相对目录   goodlist是当前views下面的方法名 下面有定义

urlpatterns = [
    # 不能在开始加反斜杠,推荐在结束加反斜杠
    re_path(r'^goodList/$', goodlist),  # 表示访问goodList 就执行goodlist方法
]

views.py

from django.http import JsonResponse


# Create your views here.

# request参数会由django帮我们自动传入
def goodlist(request):
    json = {  # 定义一个json
        'name': 'zhangsan',
        'age': 10
    }
    # 使用上面导入的JsonResponse返回json数据
    return JsonResponse(json,safe=False)

运行python manager.py runserver

访问http://localhost:8000/goodList 即可查看数据

2.url匹配规则

2.1url的自带匹配转换器

from django.urls import converters
点击converters,进入convserters.py

DEFAULT_CONVERTERS = {
    'int': IntConverter(),
    'path': PathConverter(),
    'slug': SlugConverter(),
    'str': StringConverter(),
    'uuid': UUIDConverter(),
}

有上面5个转换器,使用方式:

IntConverter源码如下:

class IntConverter:
    regex = '[0-9]+'

    def to_python(self, value):
        return int(value)

    def to_url(self, value):
        return str(value)

regex = '[0-9]+' [0-9] 就是只能09的中的整形数字   + 表示1个或多个   应该一目了然

例如:urls
from django.urls import path, re_path, include
from .views import goodlist, abc

urlpatterns = [
    re_path(r'^goodList/$', goodlist),
    path('abc/<int:a>/', abc),  # 这里访问/abc/任意数字 可以匹配  并且参数名称为a  需要在abc方法中接受a参数
]

views:
 def abc(request,a):  # 必须有a参数
    print('接收到参数 %s' % a)
    json = {  # 定义一个json
        'code': '200',
        'msg': '访问成功'
    }
    return JsonResponse(json, safe=False)   

StringConverter源码(没有使用转换器的时候默认转换器)

class StringConverter:
    regex = '[^/]+'

    def to_python(self, value):
        return value

    def to_url(self, value):
        return value
使用方式与上面类似:匹配除了斜杠/以外所有的字符都是可以的。
<name>这种不写类型 默认就是String

UUIDConverter源码

class UUIDConverter:
    regex = '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}'

    def to_python(self, value):
        return uuid.UUID(value)

    def to_url(self, value):
        return str(value)
[0-9a-f] 表示只能是0到9之间的任意整形数字和a-f 之间的字母,{8} 表示只能有8个这样的字母或者数字。- 即指定了这个字符,必须使用它,整个字符窜的意思就是8个[0-9a-f],后面用一个"-"连接,后面的以此类推

SlugConverter源码

class SlugConverter(StringConverter):
    regex = '[-a-zA-Z0-9_]+'
 -或a-z或A-Z或0-9或_   一个或多个组成的字符窜

PathConverter源码

class PathConverter(StringConverter):
    regex = '.+'
.’ 表示任意字符,所以path可以传递任何字符串,符号等等。

自定义转换器

比较简单,如果有需要可以自己百度一下

2.2re_path自己写正则表达式

re_path(r'^abc/[0-9]{2}/$', abc),  abc/后面跟两个数字

re_path(r'^abc/(?P<age>\d+)/$', abc),  abc/后面跟1个或者多个数字  该数字会作为参数 参数名age  在abc方法必须要有age参数接收 

2.3reverse反解url

总urls:

 re_path(r'^', include(("pay.urls", "pay"), namespace="pay")),

pay.urls:

from django.contrib import admin
from django.urls import path, re_path, include
from .views import goodlist, abc, bbc

urlpatterns = [
    re_path(r'^goodList/$', goodlist),
    re_path(r'^abc/(?P<age>\d+)/$', abc),
    re_path(r'^bbc/$', bbc, name='bbc'),
]

pay.views:

from django.shortcuts import render, redirect
from django.http import JsonResponse

# Create your views here.

# request参数会由django帮我们自动传入
from django.urls import reverse


def goodlist(request):
    json = {  # 定义一个json
        'name': 'zhangsan',
        'age': 10
    }
    # 使用上面导入的JsonResponse返回json数据
    return JsonResponse(json, safe=False)


def abc(request, age):
    print('接收到参数 %s' % age)
    return redirect(reverse("pay:bbc"))


def bbc(request):
    print("来了。。。")
    json = {  # 定义一个json
        'code': '200',
        'msg': '访问成功,我是bbc方法的返回值'
    }
    return JsonResponse(json, safe=False)
访问http://localhost:8000/abc/12/  首先匹配到abc方法 打印age的值  然后通过redirect重定向到 pay:bbc 
(pay: 在总url中配置的namespace  ,  bbc在pay.urls中定义的名字) 然后通过reverse反解 就重定向到了bbc方法

url暂时先用这些,后面restful风格在djangorestframework框架中学习

3.django获取参数

3.1获取地址栏的参数

应该不用解释吧

在这里插入图片描述

3.2获取url中的参数

在这里插入图片描述

3.3获取表单文件数据

postman提交先注释掉django的csrf,csrf与跨域在后面项目讲解

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',  在setting.xml中 注释掉这行
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

在这里插入图片描述

3.4获取json数据

在这里插入图片描述

3.5获取请求头信息

在这里插入图片描述

3.6获取cookie

在这里插入图片描述

4.django返回json

这里只写返回json,其它页面跳转,请自行学习(前后端分离是主流)

HttpResponse处理json字符串的返回,JsonResponse处理字典的返回,还有其它返回方式在DjangoRestFramework中谈论,封装在实战项目中谈论

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

5.request/response补充

request

比较简单 自行测试

属性:
1  HttpRequest.scheme       请求的协议,一般为http或者https,字符串格式(以下属性中若无特殊指明,均为字符串格式)
2  HttpRequest.body        http请求的主体,二进制格式。
3  HttpRequest.path             所请求页面的完整路径(但不包括协议以及域名),也就是相对于网站根目录的路径。
4  HttpRequest.path_info     获取不包含协议 ip 端口 及参数的路径 /testJson
5  HttpRequest.method               获取该请求的方法,比如: GET   POST .........
6  HttpRequest.encoding             获取请求中表单提交数据的编码。
7  HttpRequest.content_type      获取请求的MIME类型(从CONTENT_TYPE头部中获取)
8  HttpRequest.content_params  获取CONTENT_TYPE中的键值对参数,并以字典的方式表示
9  HttpRequest.GET                    返回一个 querydict 对象(类似于字典,本文最后有querydict的介绍),该对象包含了所有的HTTP GET参数
10  HttpRequest.POST                返回一个 querydict ,该对象包含了所有的HTTP POST参数,通过表单上传的所有  字符  都会保存在该属性中。
11  HttpRequest.COOKIES        返回一个包含了所有cookies的字典。
12  HttpRequest.FILES           返回一个包含了所有的上传文件的  querydict  对象。通过表单所上传的所有  文件  都会保存在该属性中。

                                               key的值是input标签中name属性的值,value的值是一个UploadedFile对
13  HttpRequest.META                返回一个包含了所有http头部信息的字典
方法:
1.HttpRequest.get_host()  返回请求的源主机。example:  127.0.0.1:8000
2 HttpRequest.get_port()    端口
3 HttpRequest.get_full_path() 返回除了协议 ip 端口后的全路径 包含参数  /testJson?age=10
4 request.build_absolute_uri()   http://localhost:8000/testJson?age=10
  request.build_absolute_uri('/')	http://localhost:8000/
  request.build_absolute_uri('/testJson')	http://localhost:8000/testJson/

response

实战开发最重要就是cookie跟header

在这里插入图片描述

在这里插入图片描述

关于set_cookie的参数:
源码如下
def set_cookie(self, key, value='', max_age=None, expires=None, path='/',
                   domain=None, secure=False, httponly=False, samesite=None):
(1)参数 :                                    
         key :这个 cookie 的 key 。
         value :这个 cookie 的 value 。
      	 max_age :最长的生命周期。单位是秒。
		 expires :过期时间。跟 max_age 是类似的,只不过这个参数需要传递一个具体的日期,比如 datetime 或者是符合日期格式的			 字符串。如果同时设置了 expires 和 max_age ,那么将会使用 expires 的值作为过期时间。
		 path :对域名下哪个路径有效。默认是对域名下所有路径都有效。比如设置为/ 那么这个项目下所有的路径都能得到该cookie
		 比如设置为/testJson  那么访问/testParam的时候就拿不到这个cookie
		 domain :针对哪个域名有效。
		         开发的时候有二级域名的概念
		         比如设置这个值为baidu.com   那么在www.baidu.com 、fanyi.baidu.com都能获得该cookie
			 	 但是设置为www.baidu.com  那么在fanyi.baidu.com下无法获得该cookie
		 secure :是否是安全的,如果设置为 True ,那么只能在 https 协议下才可用。
		 httponly :默认是 False 。如果为 True ,那么在客户端不能通过 JavaScript 进行操作。防止xss脚本攻击cookie
(2)删除cookie:
		 通过 delete_cookie方法即可删除 cookie 。实际上删除 cookie 就是将指定的 cookie 的值设置为空的字符串,然后使用将他		 的过期时间设置为 0 ,也就是浏览器关闭后就过期。
(3)获取cookie:文章前面有

6.django session

session与cookie是什么应该不用多说吧

django跟java的ssm不同,在python django中默认自带了一个测试服务器。session,reuqest response http协议都是依赖这个测试服务器,上线的时候需要正式部署uwsgi服务器

所以开发django的时候 不需要像java 还得配置tomcat

这个测试服务器默认把session持久化到了数据库

django自带测试服务器把session默认存在了 db:

ctrl+shift+f

在这里插入图片描述

  # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认) 服务器中很多session为什么能找到你自己的 因为你的浏览器上面cookie中保存了这个session的唯一标识  这里是指定cookie的key
  SESSION_COOKIE_NAME = "sessionid"      
  SESSION_COOKIE_PATH = "/"               # Session的cookie保存的路径(默认)指定当前cookie能获取的路径
  SESSION_COOKIE_DOMAIN = None             # Session的cookie保存的域名(默认)指定当前cookie能获取的郁闷
  SESSION_COOKIE_SECURE = False            # 是否Https传输cookie(默认) 
  SESSION_COOKIE_HTTPONLY = True           # 是否Session的cookie只支持http传输(默认)
  SESSION_COOKIE_AGE = 1209600             # Session的cookie失效日期(2周)(默认)
  SESSION_EXPIRE_AT_BROWSER_CLOSE = False  # 是否关闭浏览器使得Session过期(默认)
  SESSION_SAVE_EVERY_REQUEST = False       # 是否每次请求都保存Session,默认修改之后才保存(默认)

代码中使用session ,过期时间可以在页面看就是两周 mysql数据库中 这里没有设置 因为我们处在东八区 所以有8个小时的差距

在这里插入图片描述

session配redis

需要先安装redis模块,自己完成

安装redis 在setting.py中配置

CACHES = {
    "default": { # 默认 代码中调用redis存储 就存在0号库  
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/0",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    },
    "session": {  # session  session方面的就1号库
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/1",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    },
}
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "session"

在这里插入图片描述

个人观点session 存于redis中有点鸡肋。时间这些也不方便设置,redis key也不方便管理,分布式集群的时候还要单独处理,需要配置这样那样的。(个人观点)

我个人如果做登录等 我会自己设置cookie 自己保存redis来处理

我们在下个博客会去完成通过拦截器自己操作redis跟cookie 与 django自带的session认证来比较,也会详细分享redis操作

可以加微信群交流学习,相互内推
在这里插入图片描述
上一篇django入门(二)