一、装饰器要加入funtools.wrap装饰
保留函数的元数据(函数名/注释)
1.装饰器
def wrapper(f): def inner(*args,**kwargs): return f(*args,**kwargs) return inner
import functools def wrapper(f): @functools.wraps(f) def inner(*args,**kwargs): return f(*args,**kwargs) return inner 1. 执行wrapper 2. 重新赋值
index = wrapper(index)
@wrapper def index(a1,a2): """ 这是一个index函数 """ return a1+ a2 print(index.__name__) print(index.__doc__)
二、orm字段中的verbose_name
目前当注释用. 以后:在model form和form中使用.
三、路由系统中记得加入终止符 $
url(r'^login/$', admin.site.urls,name='login'),
四、用户名和密码检测
xxxx.first() # 返回对象或None
user_object = models.UserInfo.objects.filter(username=user, password=pwd).first()
xxxx.exists() # 返回布尔值
user_object = models.UserInfo.objects.filter(username=user, password=pwd).exists()
五、模板查找顺序
1、根目录templates
2、根据app注册顺序去每个app的tempaltes中找
六、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
应用场景: 用户认证 投票 每页默认显示数据
七、session
原理:随机字符串的过程....
基于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中.
拓展:djanago和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['x']
request.session.get('xx')
#设置(添加&修改) request.session['x'] = 123
#删除 del request.session['x']
配置 数据存储位置 数据库(django默认) 文件 缓存(内存/redis) cookie相关操作
应用场景 用户认证 短信验证过期 权限管理
强调 session中的数据是根据用户相互隔离. # 示例 def login(request): # 获取用户提交的用户名和密码 user = request.POST.get('user') request.session['user_name'] = user
def index(request): print(request.session['user_name'])
八、Http协议
什么是HTTP协议
超文本传输协议 关于连接:一次请求一次响应之后断开连接(无状态、短连接) 关于格式: 请求:请求头+请求体
(http:www.baidu.com/index/?a=123) send("GET /index/?a=123 http1.1 host:www.baidu.com useragent:Chrome ") send("POST /index/ http1.1 host:www.baidu.com useragent:Chrome username=alex&pwd=123") 响应:响应头+响应体 Content-Encoding: gzip Cache-Control: private 网页看到的HTML内容
扩展:常见的请求头都有哪些? - user-agent:用什么浏览器访问的网站。 - content-type: 请求体的数据格式是什么?(服务端按照格式要求进行解析)
扩展:常见的请求方式? - GET - POST
九、django请求生命周期
django请求生命周期 / 浏览器上输入http://www.xxx.com 请求到 达django后发生了什么?
补充:
1、通过js设置cookie
document.cookie = 'k1=wy222;path=/' $.cookie('k1','wy222',{path:'/'}) 注意:path不同会导致设置不同.
2、path的作用
/ , 当前网站中所有的URL都能读取到此值. "", 只能在当前页面访问的到此数据. /index/ , 只能在/index/xxx 的网页中查看.