Django学习(二)—Django的高级应用

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值