-
装饰器(加入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
from django.shortcuts import render,redirect from app01 import models def login(request): """ 用户登录 :param request: :return: """ if request.method == 'GET': return render(request, 'login.html') # 获取用户提交的用户名和密码 user = request.POST.get('user') pwd = request.POST.get('pwd') # 去数据库检查用户名密码是否正确 # user_object = models.UserInfo.objects.filter(username=user,password=pwd).first() # user_object = models.UserInfo.objects.filter(username=user, password=pwd).exists() user_object = models.UserInfo.objects.filter(username=user, password=pwd).first() if user_object: # 用户登录成功 result = redirect('/index/') result.set_cookie('xxxxxxxx',user) return result # 用户名或密码输入错误 return render(request,'login.html',{'error':'用户名或密码错误'}) def index(request): """ 博客后台首页 :param request: :return: """ user = request.COOKIES.get('xxxxxxxx') if not user: return redirect('/login/') return render(request,'index.html',{'user':user})
应用场景:用户认证,投票,每页默认显示数据
保存在用户浏览器端的键值对,向服务端发请求时会自动携带。 Cookie可以做登录之外,还可以做什么?
相关代码:
models
from django.db import models # Create your models here. class UserInfo(models.Model): username = models.CharField(verbose_name='用户名',max_length=32) password = models.CharField(verbose_name='密码',max_length=64) class Blog(models.Model): title = models.CharField(verbose_name='标题',max_length=32) content = models.TextField(verbose_name='博客园内容') author = models.ForeignKey(verbose_name='作者',to=UserInfo)
urls
from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^login/$',views.login), url(r'^index/$',views.index) ]
views
from django.shortcuts import render,HttpResponse,redirect from app01 import models # Create your views here. def login(request): if request.method == 'GET': return render(request,'login.html') user = request.POST.get('user') pwd = request.POST.get('pwd') user_object = models.UserInfo.objects.filter(username=user,password=pwd).first() if user_object: request.session['user_name']= user_object.username request.session['user_id'] = user_object.pk return redirect('/index/') return render(request,'login.html',{'error':'用户名或者密码肯定错误'}) def auth(func): def inner(request,*args,**kwargs): name = request.session.get('user_name') if not name: return redirect('/login/') return func(request,*args,**kwargs) return inner @auth def index(request): return render(request,'index.html')
templates
index.html 示例: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>欢迎{{ request.session.user_name }}使用博客后台</h1> </body> </html> </body> </html> login.html 示例: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link href="https://cdn.bootcss.com/twitter-bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet"> </head> <body> <div style="width: 500px;margin: 0 auto;border: 1px solid #dddddd;"> <form class="form-horizontal" method="post"> <div class="form-group"> <label class="col-sm-2 control-label">用户名</label> <div class="col-sm-10"> <input type="text" class="form-control" placeholder="请输入用户名" name="user"> </div> </div> <div class="form-group"> <label class="col-sm-2 control-label">密码</label> <div class="col-sm-10"> <input type="password" class="form-control" placeholder="请输入密码" name="pwd"> </div> </div> <div class="form-group"> <div class="col-sm-offset-2 col-sm-10"> <button type="submit" class="btn btn-default">提 交</button> <span style="color: red;">{{ error }}</span> </div> </div> </form> </div> </body> </html>
-
基于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的网页中查看
-
-