‘@’ 为遗漏点或者难点
‘#’ 为重点标记
'若有打眼,欢迎自取,错误之处,还请指教
DAY 11.24
@ url统一资源定位符限定有2到4kb 因为浏览器地址栏里只能输入这么多东西
1,MVT
2,观看中文文档
3,学习重点 视图 模型
4,i课件回顾。
5,新建项目,在pycharm里新建项目 选择django框架,选择虚拟环境,
workon meiduo which python
然后复制路径拷贝到虚拟环境选项。
6,项目文件介绍。
7,那啥是啥意思来着?就是需要定义路由规则?
8,框架自带服务器和部署服务器的区别。 自带服务器是什么?
9,setting是配置文件的原因是在manage文件中指定了配置命令,所以可以修改。
10,创建应用,startapp
注册/安装 应用。
11,contrib 提供的
12,试图函数必须有接受参数,表示请求对象。
13, 配置路由规则。from . import views
当前包引入视图模块
14,url语法 ,第一个参数是争着表达式,第二个参数是试图模块里的视图函数名。
@复习正则表达式
abspath 绝对路径
host=【】放的是域名
15,前后端分离不用csrf,交给网站实现
16,root_urlconf 指定根级路由文件
17, 模板文件配置信息 绑定了路径信息
18, 指定wsgi
19, 指定数据库
20,auth 用户认证模块,做密码验证的 大概和注册部分的方式有关。
21,指定静态文件按请求目录,改的时候要绑定文件路目录。
@老师用的的啥输入法?答 五笔
22,路由规则:
url字符串:协议://域名:端口/路径/?查询字符串
匹配过程 拿到url 找到路径部分 删除最左边的斜杠,与根级url进行按顺序匹配。
匹配失败就返回404
匹配成功 就删除成功的部分,留下剩余的部分如index/再与下一级的列表按顺序匹配,失败返回404 成功则返回结果。
@与flask匹配区别,逐级匹配,不成功则不返回详细映射。
位置参数和关键子参数的区别,在与返回的参数是否是按位置排列,或者按关键字参数排列?
@匹配级别 怎么分的 根级包含的子级 有咩有会混淆的可能啊?感觉好乱啊
23,django中设置路由规则不能以/开头,推荐/结尾。
24,从request中拿数据,四种途径 就是四个信息方面。
24.1 路径中:
路径中对应的部分加括号,并且要再函数中加参数提取回来。
@怎么知道别人给了几个参数?也就是怎么知道设置几个变量来接收/?
Da:肯定知道参数名,因为客户端的请求是按前端定义好的参数格式发送的,不是手动输入的,是鼠标点的。
@正则表达式可以直接按位置再url里命名。
url(r'^a/([a-z]+)/(\d{4})/$', views.a),
def a(request, city,year):
print('city=%s' % city )
print(year)
return HttpResponse('ok')
url(r'^b/(?P<city>[a-z]+)/(?P<year>\d{4})/$', views.b),
def b(request, year, city):
print(city)
print(year)
return HttpResponse("ok")
24.2 查询字符串
路径后面以?开始 &连接的字典形式的参数就是查询字符串。
获取用GET.get
url('^get1/$',views.get1)
def get1(request):
dict1 = request.GET
print(dict1)
print(dict1.get('a'))
return HttpResponse(dict1.get('a')
怎么获取指定参数?肯定知道参数名,因为客户端的请求是按前端定义好的参数格式发送的,不是手动输入的,是鼠标点的。
24.3 请求报文体 json等
表单类型的数据:request.POST
重要:只要请求体的数据是表单类型,无论是哪种请求方式(POST、PUT、PATCH、DELETE),都是使用request.POST来获取请求体的表单数据
非表单数据:request.body 返回json格式数据。
@用postman模拟post a=10
@json格式的数据构造必须是“”双引号才能解析。是postman的问题。 获取用request.body 并转换数据。
步骤为,1 接受byte类型数据 byte
2 转换为字符串dir = byte .decode
3 (导入json包)转换为字典x'husn'husn'wei json.loads(dir)
24.4 请求报文头 mehtods
request.属性 常用的有
request.method
request.path
request.user 当前用户 登陆用户或者游客。
@上面获取参数的意思是 这些东西为以后写接口做准备。
25,返回jsonresponse格式数据 return JsonResponse({字典格式的数据})括号里写数据。
如果不是json格式数据,设置字典的value值为 safe=False
@其实括号里有两个参数 一个json数据 一个safe 默认true 所以不是字典就用false。
@无论如何返回的是json格式的数据。
def json1(request):
# request.body===>接收请求体中的非表单数据,常用格式为json,类型为bytes
str1 = request.body.decode() # 转字典串
# 将字符串转字典
# json.dumps()===>字典转字符串
# json.loads()===>字符串转字典
dict1 = json.loads(str1)
print(dict1.get('a'))
return HttpResponse('OK')
------状态保持-----
26,cookie 键值对方式存在浏览器中,
写法 response.set_cookie('','',max_age='')
def cookie_set(request):
response = HttpResponse('OK')
response.set_cookie('a', 10, max_age=7 * 24 * 60 * 60)
return response
读取 request.cookies.get('key')
def cookie_get(request):
a = request.COOKIES.get('a')
print(a)
return HttpResponse('OK')
27,状态保持之session
保存在redis里 复制过来 必须有一项default
保存在缓存中 再保存到redis中。
如果存成一样的东西 记得手动分开。
@将caches设置成动态模板!!
写法:request.session['hello']='django'
def session_set(request):
# request.session['a'] = 10
request.session['b'] = 20
return HttpResponse('OK')
读取:request.session.get(‘hello’)
def session_get(request):
print(request.session.get('a'))
return HttpResponse('ok')
删除 1 :del request.session(''key)
删除2 : request.session.clear()
删除3: request.session.flush()
def session_del(request):
# del:将指定的键、值进行删除
# del request.session['b']
# clear:将所有的键、值删除
# request.session.clear()
# flush:删除整条数据
# request.session.flush()
28,session加密存储的信息是将key和值整体加密存进redis中的,不是分开存的。
@session默认过期时间是2周。
@cookie默认过期时间是关闭浏览器。
@session 依赖与cookie。
return HttpResponse('OK')
29,类视图 实现请求方式不一样的时候返回视图不一样。 并实现代码继承和复用。
class ShowView(View):
def get(self, request):
return HttpResponse('get')
def post(self, request):
return HttpResponse('post')
def show(request):
if request.method == 'GET':
return HttpResponse('get')
elif request.method == 'POST':
return HttpResponse('post')
」
—————————
DAY 11.25
昨日总结:
今日记录:
1,session 当作字典用就好了
2,类视图的as_view方法 是源码带的
他内部定义一个函数并返回了一个函数。所以路由规则里写的也是满足规则的一个函数
url('^.....view......as_view)
3,dispatch 派遣调度。
-----
100 continue 继续发送
101 switch 转换协议
200 ok
301 moved permanently 重定向了
400 badrequest 不能解析
401 unauthorized 要求登陆
403 forbidden 禁止访问
404 notfound 定向失败
405 methods notallowd 请求方法不允许
406 not acceptable 客户端无法接收
410 请求页面丢失
500 internal server error 服务器未知错误
501 not lmplenmented 服务器不支持请求
502 bad gateway 服务器网关无效
504 gateway timeout 网关超时
505 httpversion not supported 服务器不支持请求的协议版本
-------------
4,getattr 获得属性
类视图 就是根据据请求方法找方法然后执行。
5,类视图使用装饰器。再内部最先执行的函数钱加装饰器。 这里用的是dispatch()(也有get post等已经执行的方法)
也可以导入utils 导入类装饰包
@method_decorator(wrapper1,name='dispatch')
6,扩展功能类 以***Mixin结尾 表示功能类 用于特定的功能的封装。
使用方法,写个类继承他一下。
7,中间件
7.1 是什么 相当于请求钩子,为了给所有的试图函数加上一定的功能。功能类似于一个装饰器。比装饰器更装饰器!!中间件可以包含装饰器。
7.2 选择标准,看装饰的对象的多少。如果大部分需要装饰,可以用中间件然后排除掉不用装的视图,就是做if判断。
7.3 定于语法与装饰器相同
7.4 注册到setting中,middleware
7.5 排除写个if判断
7.6 中间件的执行顺序:按照注册顺序,以试图函数为分界,先进后出。
8,模板 templates决定这么文件路径的关键是已经在setting里注册了
return里面的参数:1 request, 2 xx.html 3,字典参数
并在html里接受字典的key进行渲染。
@注意与jingja2里不一样的语法指出是 运算符左右各有一个空格。
@过滤器参数冒号后面加
@复习 输出直接{
{ 变量 }}
运算{% 函数 %}
@自定义过滤器 与jinja2类似 看下文档。
----------------------
9,数据库 的orm 对象关系映射
安装包pymysql,
9.1 在项目同名文件夹下的init文件中,
import pymysql
pymysql . install_as_MySQLdb()
@解释 就是pymysql升级了 但是django中没有升级内部接口名称,执行后就相当于把pymysql 当作MySQLdb用。
9.2 需要在注册在数据库配置中
参数:DATABASES = {复制一下}
10,定义模型类。
在应用的model下定义模型类
语法:
class ***(models.Model):
各种语法:复制
默认主键
默认表名
明确定义的属性 和隐含的属性
(BookInfo, related_name = '自定义属性名’)
@自关联一对多 多对多等关系
@onotoone等
11,数据库迁移
两行命令 1 makemigrations 生成迁移文件。
2 migrate 执行迁移文件
12, 进入shell惊醒数据库的增删改查
@执行记录查询语句的配置 相当于echo语句打印吧
12.1,语法一:
objects.create()
创建完成后需要用浏览器执行?
语法2:
book = BookInfo()
book.btitle='abc'
..
..
book.save()
save执行了update然后insert
@比语法一复杂。 一般用于用户加密后存入数据库。
然后post执行???
@浏览器执行相当于什么???
12.2单条件 查询
get 单一对象
all() 查询全部 一般返回给模板遍历。要结合条件查询
filter 满足条件
exclude 满足的排除
det过滤单一结果。
@语法 属性名称__比较运算符 = 1等于值 id__exeat=1 | id = 1
2包含 contents
3 以什么开头 startwith
4 以什么结尾endwith
@@@前面加上I是表示不区分大小写。
5,isnull = false 或者ture
6,范围 in 1,3 表示或 不是在 1,3 之内
7, 不等于3 exclude(id = 3)
8,对日期做运算:__year = 1980 发布日期为1980年的书。
9, 日期比较大小 gt=1980.1.1
大于1980.1.1的日期。」
—————————
DAY 11.27
昨日总结
1,复习,创建 模型;
1:模型类.object.create(属性1=值1)
2:对象类型=模型类()
2,查询:
模型类.object.方法(属性_运算符=值)
方法:
运算符.
3, F 对象 对象的属性:
F('属性名称') 可以让属性和属性比较,而不是直接属性值来比较,就是变量与变量比较.
bread__gt=F('bcomment') * 2
4,Q对象 ,为了连接多个条件语句
fillter(Q(bread__gt=20)&Q(pk__lt=3))
@pk 表示primary key 上那么主键都可以用.
5, 逻辑与 & 可以用,代替.
6, 逻辑或 | ===>管道连接
7, 逻辑非 ~ ====>对Q对象取非.
8, aggregate 聚合函数 后面还有che类型
aggregate(sum())
返回的shug是字典类型数据
9,count
10, 排序 :order_by 以什么排序 默认升序.
降序前面加 - 减号
11, 没有查询分页方法 使用的是一个类方法.
12, 关联查询:??????
使用对象访问:对象,和属性
查询语句,对象_属性_运算符 = 值
13, 修改
put方法
14, 删除方法 deleat逻辑删除
15, 查询集:调用all() filter() ,exclude()
order_by() 返回查询集
俩个特性 :1,惰性执行
2,缓存,减少与mysql交互,迅速.会根据代码实现.
16,admin 后台管理.
16.1 创建管理员:
16.2 注册模型类:
16.3 修改中文 类属性增 verbors_name
17, 后台管理 之
17.1 增删改差
17.2 增加后台属性 定义一个类然后作为注册的属性传入修改效果.
17.3 strftime 日期转字符串.
strptime 字符串转换日期格式.
17.4 list_display 列表页面显示什么方法
17.5 list_filter 列表页面以什么过滤
17.6 search_fields 列表页面搜索选项. 需要指定搜索范围.
18, 编辑页的属性修改
fields=[属性名称] 设置编辑页面的属性
用于编辑页面的高级修改 就跟设置某些页面的高级选项一样. 不写的属性不会显示.
fieldsets=(
('组名',{'fields':[属性名])
('组名',{'fields':[属性名)
)
19, 内嵌类 定义类 加参数 然后在书籍列表嵌入英雄. 可以给书籍列表增加修改项目
列表新式内嵌 和 form表单新式内嵌.
20, 后台页面的标题
3个 标签标题
首页标题
主页标题
21, 上传图片.文件保存在磁盘 名字或者地址保存到数据库.
1,完成配置,创建目录,配置地址.
2,模型类中定义属性,ImageField
@需要数据库迁移,需要文件copy ???如果不copy的话会怎么样?
@需要在medie下新建保存库.
3,如果需要管理编辑在admin下的管理模型下面还要注册新增类.
@图片保存路径构造: media/
4, 访问需要注册文件目录.
DAY 11.28
昨日总结
数据库操作
增加:
对象=模型类.objects.create(属性1=值1,...)
创建对象,属性赋值,对象.save()
查询
模型类.objects.方法(属性__运算符=值)
方法:all()===>不能写参数
filter(),get,exclude()====>写查询条件
order_by(),aggregate()
类型:F(属性)
Q(条件语句)==》实现逻辑与&、或|、非~
说明:逻辑与可以通过逗号连接
修改
模型类.objects.filter(条件).update(属性1=值1,...)
查询对象,修改属性,对象.save()
删除
模型类.objects.filter(条件).delete()
查询对象,对象.delete()
@还没写到admin 写到了 但是迁移不了数据库
@后台管理admin
1.创建管理员
2.在应用的admin.py中注册模型类
class ***Admin(admin.ModelAdmin):
重写属性,实现页面效果
admin.site.register(模型类,***Admin)
3.在后台中可以完成数据的增加、修改、删除、查询
@repr 和str 方法显示字符串
@shell(输入python)输出对象时会执行这个对象的repr方法
@在终端输出 比如pycharm里输出的那个终端使用str的方法.
@ shell 计算机解释器界面
今日笔记
1,DRF Django REST framwork
2, web应用模式 :
前后段不分离 接受数据 处理数据 返回数据
前后段分离 处理数据返回数据 返回json
区别在与试图负责的工作, 不分离的试图负责调用模板 生成html返回. 分离的试图负责构造json返回数据.
3, RESTful 设计方法.
一般写接口就是尽量在一个类中定义不同方法.遵守规范. 这个规范即使RESTful规范.
含义:规定编写接口的规则:
1,应用域名尽量体现api
2, 版本信息体现.
@案例
图书
操作:crud
定义视图:get,post,put,delete
路由规则:一条
英雄
操作:crud
定义视图:get,post
路由规则:三条
-----------与代码有关部分-------------
3, 路径:名词 复数 原则.
4,HTTP动词都是请求方法 所以和路径区别开了.
常用四个 模型类的方法
GET () 查寻 无数据也是get方法
POST () 新建
PUT () 修改
DELETE () 删除
不常用四个 PATCH ()
HEAD ()
OPTIONS ()
5,
6,状态码
200 ----ok
201 ---- created 创建成功
204 ---- no content 无返回值 删除成功
301 ----moved permanently
400 ----bad request
403 ----forbidden
404 ----not found
406 ----methods not allowd
7,处理异常
8,返回结果
增删改查要返回结果.
9, 超媒体 API的文档信息 让前端或者用户阅读.
10, 数据格式 json格式
-----------------------------------
3,代码实现
请求方式 处理 路径 响应 状态码
get ------查询--------books/----------json-------200
post-----