跟b站武沛齐老师的视频学习
对学习过程进行一些记录以便复习 同时自我督促 :D冲鸭视频链接: 15天django入门到放弃-哔哩哔哩.
文章目录
上节回顾
CSRF:POST 时,需要用户携带随机字符
- Form
- {% csrf_token %}
- Ajax
- data
- cookie 中获取,添加到 headers 中
XSS:
- 不用 safe
- mark_safe
- 过滤关键字
Cookie:
- 放在用户浏览器端的键值对
- 可以放很多,但是对于敏感信息
ORM 操作补充
可选字段
1、models.AutoField 自增列= int(11)
如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键 primary_key=True。
2、models.CharField 字符串字段
必须 max_length 参数
3、models.BooleanField 布尔类型=tinyint(1)
不能为空,Blank=True
4、models.ComaSeparatedIntegerField 用逗号分割的数字=varchar
继承CharField,所以必须 max_lenght 参数
5、models.DateField 日期类型 date
对于参数,auto_now =True则每次更新都会更新这个时间;auto_now_add 则只是第一次创建添加,之后的更新不再改变。
6、models.DateTimeField 日期类型 datetime
同DateField的参数
7、models.Decimal 十进制小数类型= decimal
必须指定整数位max_digits和小数位decimal_places
8、models.EmailField 字符串类型(正则表达式邮箱)=varchar
对字符串进行正则表达式
9、models.FloatField 浮点类型= double
10、models.IntegerField 整形
11、models.BigIntegerField 长整形
integer_field_ranges ={
‘SmallIntegerField’: (-32768,32767),
‘IntegerField’: (-2147483648,2147483647),
‘BigIntegerField’: (-9223372036854775808,9223372036854775807),
‘PositiveSmallIntegerField’: (0,32767),
‘PositiveIntegerField’: (0,2147483647),
}
12、models.IPAddressField 字符串类型(ip4正则表达式)
13、models.GenericIPAddressField 字符串类型(ip4和ip6是可选的)
参数protocol可以是:both、ipv4、ipv6
验证时,会根据设置报错
14、models.NullBooleanField 允许为空的布尔类型
15、models.PositiveIntegerFiel 正Integer
16、models.PositiveSmallIntegerField 正smallInteger
17、models.SlugField 减号、下划线、字母、数字
18、models.SmallIntegerField 数字
数据库中的字段有:tinyint、smallint、int、bigint
19、models.TextField 字符串=longtext
20、models.TimeField 时间 HH:MM[:ss[.uuuuuu]]
21、models.URLField 字符串,地址正则表达式
22、models.BinaryField 二进制
23、models.ImageField图片
24、models.FilePathField文件
通过写 models.UserInfo.objects.create(...)
操作不会有影响;通过 Django 自带管理工具 admin 有影响:
Email 示例
创建一个含有 EmailField 的类:
class UserInfo(models.Model):
username = models.CharField(max_length=32)
email = models.EmailField()
终端创建超级用户:
在 admin.py
中进行注册:
from django.contrib import admin
from app01 import models
admin.site.register(models.UserInfo)
登录 admin
可以看到这些类:
增加一个 UserInfo 对象,若输入错误的格式,会有错误提示:
时间示例
ctime = models.DateTimeField(null=True)
枚举示例
- 应用场景:选项固定不变(ForeignKey 用于选项能够动态变化时)
color_list = (
(1, '红色'),
(2, '白色'),
(3, '蓝色')
)
color = models.IntegerField(choices=color_list)
以数字标号形式方便存储在数据库,可以拿取文字部分数据;在 admin 中则会直接展现:
字段参数
针对数据库
索引
email = models.EmailField(null=True, default='111', db_index=True, unique=True)
唯一联合索引:
class Meta:
unique_together = [
('b', 'g'),
]
不唯一联合索引:
class Meta:
index_together = [
('b', 'g'),
]
针对 admin
blank=True (可以输入为空)
verbose_name=‘xxx’(显示字段名称)
editable(是否可以编辑)
help_text(提示信息)
choices=[{0, ‘a’}, {1, ‘b’},], default=1
error_messages(修改错误信息,优先级较低)
test = models.CharField(
max_length=32,
error_messages={
'c1': '优先错信息1',
'c2': '优先错信息2',
'c3': '优先错信息3',
},
validators=[
RegexValidator(regex='root_\d+', message='错误了', code='c1'),
RegexValidator(regex='root_112233\d+', message='又错误了', code='c2'),
EmailValidator(message='又错误了', code='c3'), ]
)
模板
函数->自动执行
传入函数,自动执行:
return render(request, 'test.html', {'userinfo': {'k1': 'v1', 'k2': 'v2'}})
前端写法:
<body>
<h1>打印所有key</h1>
{% for item in userinfo %}
<h3>{{ item }}</h3>
{% endfor %}
</body>
k1
k2
<body>
<h1>打印所有key</h1>
{% for item in userinfo.values %}
<h3>{{ item }}</h3>
{% endfor %}
</body>
v1
v2
<body>
<h1>打印所有key</h1>
{% for item in userinfo.items %}
<h3>{{ item }}</h3>
{% endfor %}
</body>
(‘k1’, ‘v1’)
(‘k2’, ‘v2’)
<body>
<h1>打印所有key</h1>
{% for k, v in userinfo.items %}
<h3>{{ k }}-{{ v }}</h3>
{% endfor %}
</body>
k1-v1
k2-v2
传入函数,给出函数名(不加括号,不能加参数)自动执行。
模板自定义函数
filter
在 html 文件中使用 {{ item | upper }} 会自动调用装饰器,显示为大写字母。
自己写:
在 app01 下创建文件夹 templatetags,创建文件 xx.py
:
from django import template
register = template.Library()
@register.filter
def my_upper(value):
return value.upper()
html 文件开头加上 {% load xx %}
,即可调用 my_upper
。
支持(最多)两个参数:
@register.filter
def my_upper(value, arg1):
return value.upper() + arg1
前端:
{{ name | my_upper:"666" }}
666 即为第二个参数,冒号后不能有空格。
simple_tag
@register.simple_tag
def my_lower(value):
return value.lower()
应用:
<h1>tag</h1>
{% my_lower "ALEX" %}
可以接受多个参数:
@register.simple_tag
def my_lower(value, a1, a2, a3):
return value.lower() + a1 + a2 + a3
应用:
{% my_lower "ALEX" "A" "B" "C" %}
小结:
filter 可以使用条件语句,tag 可以接收多个参数。
filter {{ 第一个参数 | 函数名称:“第二个参数” }}
tag {% 函数名 参数 参数 %}
组件 include
pub.html
:
<div>
...{{ name }}
</div>
导入组件:
{% include 'pub.html' %}
Session
Session 是什么
Cookie 是什么?
保存在客户端浏览器上的键值对
Session是什么?
保存在服务器端的数据(本质是键值对)
{
“rkgssrlgnlr”:{‘id’:1, ‘name’:‘于浩’, …}
}
应用:依赖 Cookie
作用:保持会话(Web 网站)
好处:敏感信息不会直接给客户端
例子:
def login(request):
if request.method == 'GET':
return render(request, 'login.html')
else:
u = request.POST.get('user')
p = request.POST.get('pwd')
if u == 'root' and p == '123':
# 1. 生成随机字符串
# 2. 通过cookie发送给客户端
# 3. 服务端保存{ 随机字符串1:{'xxx'...} }
request.session['username'] = 'alex'
request.session['email'] = 'alex123@qq.com'
return redirect('/index/')
else:
return render(request, 'login.html', {'msg': '用户名或密码错误'})
def index(request):
return HttpResponse('登录成功')
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>登录界面</h1>
<form method="POST" action="/login/">
{% csrf_token %}
<input type="text" name="user">
<input type="text" name="pwd">
<input type="submit" value="提交">
{{ msg }}
</form>
</body>
</html>
查看页面元素:
数据库 django_session 表中信息:
配置
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)
SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认)
SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认)
SESSION_COOKIE_SECURE = False # 是否Https传输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,默认修改之后才保存(默认)
使用
def index(request):
# 获取、设置、删除Session中数据
request.session['k1']
request.session.get('k1', None)
request.session['k1'] = 123
request.session.setdefault('k1', 123) # 存在则不设置
del request.session['k1']
# 所有 键、值、键值对
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()
# 用户session的随机字符串
request.session.session_key
# 将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired()
# 检查 用户session的随机字符串 在数据库中是否
request.session.exists("session_key")
# 删除当前用户的所有Session数据
request.session.delete("session_key")
request.session.set_expiry(value)
*如果value是个整数,session会在些秒数后失效。
*如果value是个datatime或timedelta,session就会在这个时间后失效。
*如果value是0, 用户关闭浏览器session就会失效。
*如果value是None, session会依赖全局session失效策略。
梳理
- 放在服务端的数据(存放在文件 / 数据库 / 缓存)
- 配置文件中:可以指定存储位置、超时时间、每次刷新更新时间
- request.session 增删改查、获取随机字符串、主动设置超时时间(优先级更高)