cookie的原理
1.Cookie是由服务器生成,存储在浏览器中的键值对数据
2. 每个域名的Cookie相互独立
3. 浏览器访问域名为A的url地址,会把A域名下的Cookie一起传递到服务器
4. Cookie可以设置过期时间
在项目中设置和获取cookie
1.设置cookie
def set_cookie_hander(request,key,value):
response=HttpResponse()
response.set_cookie(key,value,max_age=60 *60) #key:键,value:值 max_age:设置过期时间
return response
2.获取cookie
def get_cookie_hander(request,key):
value=request.COOKIES.get(key)
return HttpResponse(value)
Session的设置和获取
1.Session的设置
def set_session_hander(request,key,value):
request.session[key]=value
request.session.set_expiry(60 * 60)
return HttpResponse('设置成功')
2.Session的获取
def get_session_hander(request,key):
value=request.session.get(key)
return HttpResponse(value)
3.flush方法
用于删除数据库中的session
def flush_hander(request):
request.session.flush()
return HttpResponse('flush')
4.clear方法
清空session对象
def clear_hander(request):
request.session.clear()
return HttpResponse('clear')
Django连接Redis服务
Redis的特点
1.非关系型数据库
2.数据读写速度快
3.可以存储的数据量少
Redis服务环境搭建
1.下载redis 并配置环境变量
2.下载相应的插件
pip install redis
pip install django-redis
pip install django-redis-sessions
Setting设置
在Setting文件中配置redis:
## redis配置
SESSION_ENGINE = 'redis_sessions.session' # 选择Redis存储Session
SESSION_REDIS_HOST = 'localhost' # Redis的主机地址
SESSION_REDIS_PORT = 6379 # Redis的端口号
SESSION_REDIS_DB = 0 # 数据库编号,0-11
SESSION_REDIS_PASSWORD = '' # 登录Redis的密码
redis中有12的数据库
表单数据的提交与接收
表单编写
form标签
提交地址 action
提交方法 method get post
提交文件 enctype="multipart/form-data"
<form action="{% url 'form_post' %}" method="post">
username:
<input type="text" name="username"> <br/>
checkbox:
<input type="checkbox" name="hobbys" value="Java"> Java
<input type="checkbox" name="hobbys" value="Python"> Python
<br/>
<input type="submit" value="submit">
</form>
Get和Post的提交方式
get提交的数据参数在url中
post提交的数据被加密,url中无法看到
后台数据的接收
Get请求:
value = request.GET.get(【key】,【默认值】)
values = request.GET.getlist (【key】)
Post请求:
value = request.POST.get(【key】,【默认值】)
values = request.POST.getlist (【key】)
注:
Post请求,需要在表单中加入{% csrf_token %},或者取消csrf中间件
模型类的多表操作
外键种类
关键字 | 说明 |
---|---|
ForeignKey | 一对多 |
ManyToManyField | 多对多 |
OneToOneField | 一对一 |
外键的常用参数
关键字 | 说明 |
---|---|
to | 引用的模型类(自关联"self") |
on_delete | 外键约束:1.models.CASCADE 级联操作(多对一,一的一方删除,多的一方也删除)2.models.PROTECT 报异常(被引用的一方不能删除)3.models.SET_NULL 设置为null(多对一,一的一方删除,多的一方外键为null)4.models.DO_NOTHING 什么也不做 |
related_name | 反向引用,如果两个表间有多种外键关系,需要指明related_name如果指明,默认是【模型类小写】_set |
代码示例:
在model.py中定义两个类:User2(用户类),News(帖子类)
##一对多 多对多
class User2(models.Model):
usname=models.CharField(max_length=16)
class News(models.Model):
topic=models.CharField(max_length=100)
sender=models.ForeignKey(to=User2,on_delete=models.CASCADE,related_name='sender_set') #用户发表帖子
collectors=models.ManyToManyField(to=User2,related_name='collectors_set') #用户收藏帖子
执行流程
1.打开终端,执行命令:生成迁移文件
python manage.py makemigrations
2.执行:执行迁移文件
python manage.py migrate
3.启动python交互式编程
python manage.py shell
下面就是一对多的示例
## 引入需要的包
from user.models import *
## 创建user对象
user = User2()
user.usname='用户1'
user.save()
## 创建news对象
news=News()
news.topic='帖子1'
news.sender=user #表示帖子的发表者为用户1
user.save()
##查看命令
## 用户需要查看自己发表过的帖子
user.sender_set.all()
## 查看帖子是属于哪个用户的
news.sender
多对多的示例
## 得到user对象和news对象
user=User2.objects.get(id=1) ## user对象
news=News.objects.get(id=2) ## news对象
## 用户收藏帖子
user.collectors_set.add(news)
user.save()
##查看用户收藏的帖子
user.collectors_set.all()
## 查看帖子被哪些用户收藏
news.collectors.all()
##通过帖子添加用户
## 新创建一个用户user2
user2=User2()
user2.usname='用户2'
user2.save()
##通过news对象添加user2对象
news.collectors.add(user2)
news.save()
##查看用户收藏的帖子
user.collectors_set.all()
## 查看帖子被哪些用户收藏
news.collectors.all()
自关联的示例
在model.py文件中添加如下代码:
## 自关联
class Area(models.Model):
name=models.CharField(max_length=10)
pArea=models.ForeignKey(to='self',null=True,on_delete=models.CASCADE)
演示示例:
启动python 交互式
python manage.py shell
## 引入Area包
from user.models import Area
##创建一个area对象
area=Area()
area.name='北京'
area.save()
## 在创建一个area对象,使它属于北京市,例如朝阳区
area2=Area()
area2.name='朝阳区'
area2.pArea=area
area2.save()
##查看北京下面的区域
area.area_set.all()
##查看朝阳区的所属区域
area2.pArea.name