Django入门到放弃 学习笔记 07

跟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失效策略。

梳理

  1. 放在服务端的数据(存放在文件 / 数据库 / 缓存)
  2. 配置文件中:可以指定存储位置、超时时间、每次刷新更新时间
  3. request.session 增删改查、获取随机字符串、主动设置超时时间(优先级更高)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值