django 五 知识点总结 一
1.- restful 规范(10)
- django rest framework框架(10)
- 跨域
- 为什么会有跨域?
- 绕过浏览器同源策略就可以跨域。
- jsonp
动态创建script标签
同源策略会阻止ajax请求;不阻止具有src属性的标签
<script src='xxxx'></script>
- cors
设置响应头
2.为什么会有跨域?
1、浏览器的同源策略限制
2、跨域(域名,端口不一样都是跨域)
3、同源对ajax是禁止的,ajax是XHR(XMLHttpRequest请求)对象来为底层做出来的
解决跨域问题方案。
1,在django中解决方案:
- 中间件中设置响应头
- django中的一个第三方组件:corscors方案,从浏览器出发,让浏览器允许url,允许响应头,允许方法。
cors,设置响应头
- 简单请求
- 复杂请求
- options请求做预检
- PUT/POST....
简单请求处理方案:在响应头中添加
Access-Control-Allow-Origin=“允许跨域的url”,即跨省域时,请求头Origin的值,所以一般是获取Origin的值。
Access-Control-Allow-Method=“*”,允许的方法。
非简单请求处理方案:在相应头中添加
Access-Control-Allow-Origin=“允许跨域的url”,即跨域时,可以获取请求头Origin的值。
Access-Control-Allow-Method=“*”,允许的方法
Access-Control-Request-Headers=“Content-Type,自定义的header的key”。
带cookies的跨域解决:在响应头添加
Access-Control-Allow-Credentials,="true",允许使用cookies
2,jsonp方案,同源允许src,所以利用这点,可以使用script标签,
- jsonp,在客户端动态创建一个script标签
1.客户端:创建一个
<script src='http://www.jxntv.cn/data/jmd-jxtv2.html'></script>
<script>
function func(arg){
alert(arg);
}
</script>
2.服务端:接收到请求并处理并返回值 "func('success')"
相当于:
<script>
func('success')
</script>
jsonp缺点:jsonp只能发送GET请求,而且前后端函数名要相同,所以就有了cors。
3. 你理解的http协议?
- 建立在tcp之上
1. Http协议?
Http协议就是一个传输数据格式。
我原来学习django框架,从socket服务端开始学起。
自己创造了一个socket服务器来充当:网站。
浏览器当socket客户端。
更清楚的明白到底http协议是什么?
- 请求头 请求头
- 响应头 响应头
一次请求响应后,断开连接。
2. 常见请求头
3. 常见的请求体?
Form表单提交:
POST /index http1.1\r\nhost:www.luffycity.com...\r\n\r\nusername=alex&password=123&...
Ajax请求:
POST /index http1.1\r\nhost:www.luffycity.com...\r\n\r\nusername=alex&password=123&...
POST /index http1.1\r\nhost:www.luffycity.com...\r\n\r\n{“username”:"alex","password":123}
补充:django中获取请求体
- request.POST
- request.body
4. 常见请求头
- Content-Type
- User-Agent
- referer,可以做图片防盗链。
- Host
- cookies
5. 常见的请求方法:
- GET/POST/DELETE/PUT/PATCH/OPTIONS
6. 常见的状态码:
- 200
- 301/302 301临时重定向 302永久重定向
- 403/404 403错表示资源不可用。服务器理解客户的请求,但拒绝处理它,通常由于服务器上文件或目录的
权限设置导致的WEB访问错误。 404找不到页面
- 500 --- 后端程序问题
7. 序列化
- source
source='get_level_display'
source='course.title'
- method
8. ORM补充:
a. 需求: 只取某n列
queryset=[ {},{}]
models.User.objects.all().values( 'id','name')
queryset=[ (),()]
models.User.objects.all().values_list( 'id','name')
queryset=[ obj,obj]
result = models.User.objects.all().only('id','name','age') 性能好
# result = models.User.objects.all().defer('id','name','age') defer查找跟olny相反的字段
for item in reuslt:
print(item.id,item.name,item.age)
b. 需求: 打印所有用户姓名以及部门名称
class depart:
title = ....
class User:
name = ...
dp = FK(depart)
select * from user
result = models.User.objects.all()
for item in result:
print(item.name)
select * from user left join depart on user.dp_id = depart.id
result = models.User.objects.all().selected_related('dp') selected_related主动做关联表提高性能
for item in result:
print(item.name,item.dp.title )
9.支付宝支付
a. 去支付宝申请
- 正式:营业执照
- 测试:沙箱测试环境
APPID:2016082500309412
买家:
nbjsag5718@sandbox.com
111111
111111
b. 开发程序
SDK
- 官方
- github
pay.py
依赖:pip3 install pycryptodome
公钥私钥:
- 应用公钥
- 支付宝公钥
- 应用私钥
10.wsgi
- web服务网关接口
- 实现该协议的模块:
- wsgiref
- werkzurg
- uwsig
11. 使用中间件做过什么?
- 内置
- csrf
- session
- 自定义
- 登录认证
- 权限
- cors
12.6. 中间件中有多少个方法?
5个
- 应用场景:
- 登录认证,不再需要在每个函数中添加装饰器
- 权限,当用户登录时候获取当前用户所有权限并放入session,然后再次访问其他页面,获取当前url并在session中进行匹配。如果没有匹配成功,则在中间件返回“无权访问”
- 跨域,
- jsonp,动态创建一个script标签。
- cors,设置响应头
应用:本地开始前后端分离的时使用。
13.FBV和CBV是什么?以及优缺点。
CBV(class base views) 就是在视图里使用类处理请求
CBV的执行流程:
浏览器向服务器端发送请求,服务器端的urls.py根据请求匹配url,找到要执行的视图类,
执行dispatch方法区分出是POST请求还是GET请求,执行views.py对应类中的POST方法或GET方法。
FBV(function base views) 就是在视图里使用函数处理请求。
14.rest api
15.django rest framework的作用?
快速搭建基于restful规范的接口。
- 访问频率控制原理:
匿名:
1.1.1.1:[时间,时间,时间,时间,]
登录:
user:[时间,时间,时间,时间,]
默认将访问记录放在缓存中:redis/memcached
- 序列化
from rest_framework.serializers import Serializer
class XX(Serializer):
pass
ser =XX(queryset,many=True) # ListSerializer对象
ser =XX(obj, many=False) # XX对象
- 列表生成式
- 根据字符串的形式,自动导入模块并使用反射找到模块中的类【参考:s9day108】。
17.如何实现的访问频率控制?
匿名用户:无法控制,因为用户可以换代理IP
登录用户:如果有很多账号,也无法限制
参考源码:from rest_framework.throttling import SimpleRateThrottle
18.update_or_create 更新或创建
19.django组件:contenttype
组件的作用:可以通过两个字段让表和N张表创建FK关系
表结构:
from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
class DegreeCourse(models.Model):
"""学位课程"""
name = models.CharField(max_length=128, unique=True)
course_img = models.CharField(max_length=255, verbose_name="缩略图")
brief = models.TextField(verbose_name="学位课程简介", )
class Course(models.Model):
"""专题课程"""
name = models.CharField(max_length=128, unique=True)
course_img = models.CharField(max_length=255)
# 不会在数据库生成列,只用于帮助你进行查询
policy_list = GenericRelation("PricePolicy")
class PricePolicy(models.Model):
"""价格与有课程效期表"""
content_type = models.ForeignKey(ContentType) # 关联course or degree_course
object_id = models.PositiveIntegerField()
#不会在数据库生成列,只用于帮助你进行添加和查询
content_object = GenericForeignKey('content_type', 'object_id')
valid_period_choices = (
(1, '1天'),
(3, '3天'),
(7, '1周'), (14, '2周'),
(30, '1个月'),
(60, '2个月'),
(90, '3个月'),
(180, '6个月'), (210, '12个月'),
(540, '18个月'), (720, '24个月'),
)
valid_period = models.SmallIntegerField(choices=valid_period_choices)
price = models.FloatField()
使用:
# 1.在价格策略表中添加一条数据
# models.PricePolicy.objects.create(
# valid_period=7,
# price=6.6,
# content_type=ContentType.objects.get(model='course'),
# object_id=1
# )
# models.PricePolicy.objects.create(
# valid_period=14,
# price=9.9,
# content_object=models.Course.objects.get(id=1)
# )
# 2. 根据某个价格策略对象,找到他对应的表和数据,如:管理课程名称
# price = models.PricePolicy.objects.get(id=2)
# print(price.content_object.name) # 自动帮你找到
# 3.找到某个课程关联的所有价格策略
# obj = models.Course.objects.get(id=1)
# for item in obj.policy_list.all():
# print(item.id,item.valid_period,item.price)
#
20. django请求生命周期
- wsgi, 他就是socket服务端,用于接收用户请求并将请求进行初次封装,然后将请求交给web框架(Flask、Django)
- 中间件,帮助我们对请求进行校验或在请求对象中添加其他相关数据,例如:csrf、request.session
- 路由匹配
- 视图函数,在视图函数中进行业务逻辑的处理,可能涉及到:orm、templates => 渲染
- 中间件,对响应的数据进行处理。
- wsgi,将响应的内容发送给浏览器。
21. restful 规范
什么是接口?
- URL
- 约束
# 约束继承(实现)了他的类中必须含有IFoo中的方法
interface IFoo:
def func(self): pass
class Foo(IFoo):
def func(self):
print(11111)
1. 根据method不同,进行不同操作
GET/POST/PUT/DELETE/PATCH
2. 面向资源编程
http://www.luffycity.com/salary
3. 体现版本
http://www.luffycity.com/v1/salary
http://www.luffycity.com/v2/salary
https://v4.bootcss.com/
https://v3.bootcss.com/
4. 体现是API
http://www.luffycity.com/api/v1/salary
http://www.luffycity.com/api/v2/salary
http://api.luffycity.com/v1/salary
http://api.luffycity.com/v2/salary
5. https
https://www.luffycity.com/api/v1/salary
https://www.luffycity.com/api/v2/salary
6. 响应式设置状态码
200
300
400
500
return HttpResponse('adfasdf',status=300)
7. 条件
https://www.luffycity.com/api/v2/salary?page=1&size=10
8. 返回值
https://www.luffycity.com/api/v2/salary
GET: 所有列表
{
code: 10000,
data: [
{'id':1,'title':'高亮'},
{'id':1,'title':'龙泰'},
{'id':1,'title':'小东北'},
]
}
POST: 返回新增的数据
{'id':1,'title':'高亮'}
https://www.luffycity.com/api/v2/salary/1/
GET: 获取单条数据
{'id':1,'title':'高亮'}
PUT:更新
{'id':1,'title':'高亮'}
PATCH: 局部更新
{'id':1,'title':'高亮'}
DELETE:删除
9. 返回错误信息
{
code: 100001,
error: 'xxx错误'
}
10. Hypermedia API
ret = {
code: 1000,
data:{
id:1,
name:'小强',
depart_id:http://www.luffycity.com/api/v1/depart/8/
}
}
建议大家使用restful规范
路飞学成的表结构
路飞表结构:
- 课程(13表)
- 课程大类
- 课程子类
- 学位课
- 讲师
- 奖学金
- 专题课(学位课模块表)
- 价格策略(contenttype)
- 课程详细(o2o -> 水平分表)
- 常见问题
- 课程大纲
- 章节
- 课时
- 作业
- 深科技(4+2)
- 用户表
- 用户token
- 文章来源
- 文章表
- 通用评论表
- 通用收藏表
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
(1) TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送。
(2) 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
(3) 服务器关闭客户端的连接,发送一个FIN给客户端。
(4) 客户端发回ACK报文确认,并将确认序号设置为收到序号加1。

