装饰器(加入functools.wraps装饰,保留函数的元数据--函数名/注释)
1.1 orm字段中的verbose_name
目前当注释用
以后:在model form和form中使用
import functools
def wrapper(f):
@functools.wraps(f)不加,获取的其实是inner的函数名和函数注释
def inner(*args,**kwargs):
return f(*args,**kwargs)
return inner
'''
1.执行wrapper
2.重新赋值
index=wrapper(index)
'''
@wrapper
def index(a1,a2):
return a1+a2
print(index.__name__)..................获取函数名
print(index.__doc__)...................获取函数内的注释
什么是HTTP协议
超文本传输协议
关于连接:一次请求一次响应之后断开连接(无状态,短连接)
关于格式:
请求:请求头+请求体(http:www.baidu.com/index/?a=123)
send('GET /index/?a=123 http1.1\r\nhost:www.baidu.com\r\nuser-agent:Chrome\r\n\r\n')
send('POST /index/http1.1\r\nhost:www.baidu.com\r\nuser-agent:Chrome\r\n\r\nusername=alex&pwd=123')
响应:响应头+响应体
Content-Encoding:gzip\r\nCache-Control:private\r\n\r\n网页看到的HTML内容
扩展:
常见的请求头都有哪些?
-user-agent:用什么浏览器访问的网站
-content-type:请求体的数据格式是什么?(服务端按照格式要求进行解析)
常见的请求方式:
-GET
-POST
请求头直接用一个\r\n相连
请求体之间用\r\n\r\n相连
django请求生命周期/浏览器上输入http://www.xxx.com请求到django后发生了什么?
路由西永中记得加入终止符$
案例:博客系统
用户名和密码检测
xxxx.first()#返回对象或者None
xxxx.exists()#返回布尔值
模板查找顺序
根目录templates
根据app注册顺序去每个app的templates中找
基本实现用户登录
用户未登录就不能访问指定页面
基于cookie实现
cookie操作
def login(request):
return HttpResponse('...')
return render('...')
return redirect('...')
设置cookie
data = redirect('...')
data.set_cookie()
读取cookie
request.COOKIES.get('xx')
return data
必须背会以下三个参数:
key,value='',max_age=None
应用场景:用户认证,投票,每页默认显示数据
保存在用户浏览器端的键值对,向服务端发请求时会自动携带。
Cookie可以做登录之外,还可以做什么?
基于session实现(推荐)
依赖cookie
是一种存储数据的方式,依赖于cookie,实现本质:
用户向服务端发送请求,服务端做两件事:生成随机字符串;为此用户开辟一个独立的空间来存放当前用户独有的值。
在空间中如何想要设置值:
request.session['x1']=123
request.session['x2']=456
在空间中取值:
request.session['x2']
request.session.get('x2')
视图函数中的业务操作处理完毕,给用户响应,在响应时会将随机字符串存储到用户浏览器的cookie中。
问题:
cookie和session的区别?
cookie是存储在客户端浏览器上的键值对,发送请求时浏 览器会自动携带. session是一种存储数据方式,基于cookie 实现,将数据存储在服务端(django默认存储到数据库).
其本质是:用户向服务端发送请求,服务端做两件事:生成随机字符 串;为此用户开辟一个独立的空间来存放当前用户独有的值.
在空间中如何想要设置值:
request.session['x1'] = 123
request.session['x2'] = 456
在空间中取值:
request.session['x2']
request.session.get('x2')
视图函数中的业务操作处理完毕,给用户响应,在响应时会 将随机字符串存储到用户浏览器的cookie中.
扩展
django和session相关的配置
SESSION_COOKIE_NAME = "sessionid" #
Session的cookie保存在浏览器上时的key,即: sessionid=随机字符串
SESSION_COOKIE_DOMAIN = None #
api.baidu.com /www.baidu.com/ xxx.baidu.com SESSION_COOKIE_PATH = "/" # Session的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,默认修改之后才保存
django中的session如何设置过期时间?
SESSION_COOKIE_AGE = 1209600 # Session的 cookie失效日期(2周)
django的session默认存储在数据库,可以放在其他地方吗?
小系统:默认放在数据库即可.
大系统:缓存(redis)
文件
SESSION_ENGINE = 'django.contrib.sessions.backends.file'
SESSION_FILE_PATH = '/sssss/'
缓存(内存)
SESSION_ENGINE=
'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS='default'
CACHES={
'default':{
'BACKEND':
'django.core.cache.backends.locmem.LocMem Cache',
'LOCATION':'unique-snowflake',
}
}
缓存(redis)
SESSION_ENGINE =
'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default'
CACHES = {
"default": {
"BACKEND":
"django_redis.cache.RedisCache",
"LOCATION":
"redis://127.0.0.1:6379",
"OPTIONS": {
"CLIENT_CLASS":
"django_redis.client.DefaultClient",
"CONNECTION_POOL_KWARGS":
{"max_connections": 100}
# "PASSWORD": "密码",
}
}
}
操作session
设置(添加&修改)
request.session['x1'] = 123
request.session['x2'] = 456
读取
request.session['xx']
request.session.get('xx')
删除
del request.session['xx']
request.session.keys()
request.session.values()
request.session.items()
request.session.set_expiry(value)
request.session.session_key
应用场景:用户认证,短信验证过期,权限管理
强调:
session中的数据是更具用户相互隔离
#示例
def login(request):
获取用户提交的用户名和密码
user = request.POST.get('user')
request.session['user_name'] = user
def index(request):
print(request.session['user_name'])
通过js设置cookie
document.cookie = 'k1=wy222;path=/'
$.cookie('k1','wy222',{path:'/'})
注意:path不同会导致设置不同
path的作用
/,当前网站中所有的URL都能读取到此值
"",只能在当前页面访问的到此数据
/index/,只能在/index/xxx的网页中查看
原文:https://www.cnblogs.com/-777/p/11636772.html