阅读:56
免费分享,平时搬砖,周末会录制匹配的视频。
配套视频地址:https
其中view就是python的视图,v层,核心的代码逻辑都是写在view中
测试项目需要用到postman,下载:
链接:https://pan.baidu.com/s/1yMSKdXBi7kCffJb6VAi_9w 提取码:35sy
流程应该很清晰,就是根据在浏览器或者小程序等输入一个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 即可查看数据
from django.urls import converters
点击converters,进入convserters.py
DEFAULT_CONVERTERS = {
'int': IntConverter(),
'path': PathConverter(),
'slug': SlugConverter(),
'str': StringConverter(),
'uuid': UUIDConverter(),
}
有上面5个转换器,使用方式:
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] 就是只能0到9的中的整形数字 + 表示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)
class StringConverter:
regex = '[^/]+'
def to_python(self, value):
return value
def to_url(self, value):
return value
使用方式与上面类似:匹配除了斜杠/以外所有的字符都是可以的。
<name>这种不写类型 默认就是String
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],后面用一个"-"连接,后面的以此类推
class SlugConverter(StringConverter):
regex = '[-a-zA-Z0-9_]+'
-或a-z或A-Z或0-9或_ 一个或多个组成的字符窜
class PathConverter(StringConverter):
regex = '.+'
‘.’ 表示任意字符,所以path可以传递任何字符串,符号等等。
比较简单,如果有需要可以自己百度一下
re_path(r'^abc/[0-9]{2}/$', abc), abc/后面跟两个数字
re_path(r'^abc/(?P<age>\d+)/$', abc), abc/后面跟1个或者多个数字 该数字会作为参数 参数名age 在abc方法必须要有age参数接收
总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框架中学习
应该不用解释吧
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',
]
这里只写返回json,其它页面跳转,请自行学习(前后端分离是主流)
HttpResponse处理json字符串的返回,JsonResponse处理字典的返回,还有其它返回方式在DjangoRestFramework中谈论,封装在实战项目中谈论
比较简单 自行测试
属性:
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/
实战开发最重要就是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:文章前面有
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个小时的差距
需要先安装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入门(二)