Django.3

继承模块

class Animal(models.Model):
    name = models.CharField(max_length=32)
    class Meta:
        abstract = True # 设置为抽象模块,即基类模块不会生成

class Cat(Animal):
    c_color = models.CharField(max_length=32)

class Dog(Animal):
    d_leg = models.IntegerField(default=4)

模型与表的先后顺序

  • db -> models

    • 配制好数据库连接信息

    • python manage.py inspectdb > models.py

  • models -> db

    • 目前使用

环境转移

  • 导出所有依赖

    • pip freeze > requirements.txt 把环境导到文档中

  • 安装所有依赖

    • pip install -r requirements.txt 在新环境中导入

模版语法

  • 多行注释
{% comment %}
        内容
{% endcomment %}
# 不用<!-- --> , comment更安全
  • for
{% for 变量 in 列表 %}
        语句1 
    {% empty %}
        语句2
{% endfor %}
# empty 意思为当列表为空或不存在时,执行empty之后的语句2
{% for h in hobby %}

    {% if forloop.first %}
        <li style="color: #ff1a3a">{{ forloop.counter }}:{{ h }}:{{ forloop.revcounter }}</li>
    {% elif forloop.last %}
        <li style="color: #1bff5d">{{ forloop.counter }}:{{ h }}:{{ forloop.revcounter }}</li>
    {% else %}
        <li>{{ forloop.counter }}:{{ h }}:{{ forloop.revcounter }}</li>
    {% endif %}

{% empty %}
    <li>暂时没有消息</li>
{% endfor %}
# {{ forloop.counter }} 表示当前是第几次循环,从1数数
# {{ forloop.counter0}}表示当前是第几次循环,从0数数
# {{ forloop.revcounter}}表示当前是第几次循环,倒着数数,到1停
# {{ forloop.revcounter0}}表示当前第几次循环,倒着数,到0停
# {{ forloop.first }} 是否是第一个  布尔值
# {{ forloop.last }} 是否是最后一个 布尔值
  • 模版中的点语法
    • 字典查询
    • 属性方法
    • 索引
def index(request):

    data = {
        "msg": "VUE",
        "hobby": ["eat", "sleep", "gaming", "study", "reading"],
        "score":{
            "en": 150,
            "ch": 105
        },
        "flag":False
    }

    # return render(request, "Index.html", context=data)
    template = loader.get_template('Index.html')
    result = template.render(context=data) # 渲染模版的两种方法

    return HttpResponse(result)

# data字典传递到模版中

<h1>{{ msg }}</h1>  # 显示“msg”对应的value值:VUE
<h3>{{ score.en }}</h3>  # 显示”score"内"en"对应的value:150
<h2>{{ hobby.2 }}</h2>  # 显示"hobby"的第二个索引值:gaming

反向解析

  • 准备工作

    • 在根urls中,include时添加namespace

    • 在子urls中,添加name属性

  • 使用

    • python中 reverse("namespace:name")

    • 模板中 {% url 'namespace:name' %}

  • 如果有参数

    • 位置参数

      • python reverse('namespace:name', args=(value, value, value...))

      • 模板中 {% url "namespace:name" value value ... %}

    • 关键字参数

      • python reverse("namespace:name", kwargs={key:value, key:value})

        • 兼容写法 reverser("namespace:name", args=(value, value...)) 不推荐

      • 模板中

        • {% url "namespace: name" key=value key=value... %}

# 工程问价你的urls中
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^two/', include('Two.urls', namespace="two")),
]

# 项目文件的urls中
urlpatterns = [
    url(r'^login/', views.login, name="login"),
]

#模版中
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Login</title>
</head>
<body>
<form action="{% url 'two:login' %}" method="post">

    {% csrf_token %} #请求伪造

    <input type="text" name="username" placeholder="请输入用户名">

    <button>登录</button>

</form>
</body>
</html>

CSRF

跨站请求伪造

某些恶意网站包含链接,表单,按钮,Js利用登陆用户在浏览器中的认证信息,进行非法操作,攻击服务,破坏数据

  • 在表单中添加 {% csrf_token %}
  • 在settings中的中间件MIDDLEWARE中配置打开 'django.middleware.csrf.CsrfViewMiddleware',注释掉这行

静态文件配置

在settings.py中最底下有一个叫做static的文件夹,主要用来加载一些模板中用到的资源,提供给全局使用

这个静态文件主要用来配置CSS,HTML,图片,字体文件等

STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'static')
]

中间件

是一个轻量级的,底层的插件,可以介入Django的请求和相应过程(面向切面编程)

中间件的本质就是一个python类

面向切面编程(Aspect Oriented Programming)简称AOP。AOP的主要实现目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合的隔离效果。

Django.3

  • process_request(self,request):在执行视图前被调用,每个请求上都会调用,不主动进行返回或返回HttpResponse对象
  • process_view(self,request,view_func,view_args,view_kwargs):调用视图之前执行,每个请求都会调用,不主动进行返回或返回HttpResponse对象
  • process_template_response(self,request,response):在视图刚好执行完后进行调用,每个请求都会调用,不主动进行返回或返回HttpResponse对象
  • process_response(self,request,response):所有响应返回浏览器之前调用,每个请求都会调用,不主动进行返回或返回HttpResponse对象

  • process_exception(self,request,exception):当视图抛出异常时调用,不主动进行返回或返回HttpResponse对象

 

上一篇:Django之模板层


下一篇:Django(六): 模板基础