zoukankan      html  css  js  c++  java
  • django

    Introduction

    开源web应用框架,由python开发

    MVC设计典范,一种业务逻辑,数据,界面显示分离的方法组织代码。核心思想解耦,

    Model:逻辑部分,通常负责在数据库中取数据

    View:处理数据显示的部分

    Controller: 处理用户交互的部分,

    MTV:

    Model:负责业务对象和数据库对象(ORM)

    Template: 一个html页面

    View: 相当于MVC里的Controller, 负责业务逻辑和在设当的时候调用Model和Template

    Python三大主流web框架

    django, flask, tornado

    django

    自带的组件和功能非常多,socket部分默认使用wsgiref

    flask

    自带组件少,依赖于三方组件

    socket部分使用werkzeug

    模板语法使用jinja2

    Tornado

    异步非阻塞

    socket, 路由匹配和模板语法都是Tornado自己实现的

    安装

    1.11.4 2.0, 2.1 可适配 python 3.6

    pip install Django==1.11.4
    

    初步使用

    创建项目

    django-admin startproject project
    
    three . /F
    

    项目目录说明

    manage.py 一个命令行工具,可以使我们用多种方式对Django项目进行交互

    project目录:

    __init__.py 是一个空文件

    settings.py 是项目配置文件

    urls.py 是项目的URL声明

    wsgi.py 是项目与WSGI兼容的Web服务器入口

    应用目录说明

    migrations/, 所有数据库相关的操作

    admin.py, 后台管理

    apps.py, 注册apps使用

    tests.py, 测试代码使用

    views.py 处理业务逻辑

    基本操作

    配置数据库

    在settings.py文件中,通过DATABASES选项配置

    ENGINE: django.db.backends.mysql
    NAME: database_name
    USER:
    PASSWORD:
    HOST:
    PORT:"3306"
    
    

    __init__.py里写入

    import pymysql
    pymysql.install_as_MySQLdb()
    

    创建项目

    在一个项目中可以创建多个应用,每个应用运行一种业务逻辑

    python manage.py startapp app_name 
    

    项目目录说明:

    __init__.py 
    admin.py #
    models.py
    views.py
    

    激活应用

    settings.py 将应用名加入到INSTALLED_APPS选项中

    模型

    由一个数据表,就对应由一个模型

    在models.py文件中定义模型

    from django.db import models
    class MyModels(models.Model):
        name = models.CharFiled(max_length=20)
        score = models.IntegerField()
        # 类中的属性对应表中的字段
        def __str__(self):
            return f"{self.name}"
    

    说明:不需要定义主键,在生成时自动添加,并且值为自动增加的

    数据库支持

    Django对各种数据库提供了很好的支持,Django为这些数据库提供了统一的接口

    ORM

    对象关系映射

    任务:根据对象的类型生成表结构,将类对象,列表的操作转换为sql语句,将sql查询到的结果转为对象,列表

    优点:极大减轻了开发人员的工作量,不需要面对因数据库的变更而修改代码

    数据库迁移

    1. 生成迁移文件

      python manage.py makemigrations
      
    2. 执行迁移

      python manage.py migrate # 执行迁移
      

    定义模型

    定义属性

    如果手动设置主键后,则django不会再生成默认主键列

    不允许使用连续下划线

    字段类型:

    .AutoField # 自动增长的主键
    .CharField # 字符串
    .TestField # 长文本,大于3000
    .IntegerFiled # 整数类型
    .DecimalField # 小数
    .BooleanField
    .FloatField
    .DateField
    .TimeField
    .DateTimeField
    .FileField # 一个上传文件的字段
    
    

    字段选项

    db_column # 设置字段名称
    primary_key=True
    unique=True
    

    关系

    .ForeignKey: 一对多
    

    元选项

    在模型类中定义Meta类,用于设置元信息

    class TestClass:
        ...
        class Meta:
            db_table="xxx" # 定义数据表名,推荐使用小写字母,默认项目名小写_表名
       
            ordering=[] # 对象的默认排序字段,获取对象列表时使用
    

    模型成员

    类属性:objects, 时Manager类型,作用是与数据库进行交互

    当定义模型类时没有制定管理器,则Django为模型创建一个名为objects的管理器

    可以自定义管理器

    
    

    自定义管理器Manager类

    模型管理器时Django的模型与数据库交换的接口,

    作用:向管理器类中添加额外的方法,修改管理器返回的原始查询集,重写get_queryset()方法

    创建对象

    目的:向数据库中添加数据,注意__init__方法已经在父类中,在自定义的模型中无法使用

    方法: 1. 在模型类中增加一个类方法,2.在自定义的管理器添加一个额外的方法

    models.User.objects.create(username=xxx, password=xxx) # 创建对象后,会直接写入数据库
    

    模型查询

    查询集:表示从数据库获取的对象集合,

    查询集可以有多个过滤器

    查询集

    • 在管理器上调用过滤器返回新的查询集
    • 惰性执行
    • 直接访问数据的情况:迭代和序列化,与if合用
    • 返回查询结果的方法的过滤器:all(), filter(key=value, key2=value2), exclude(), oder_by(), values(),
    • 返回单个数据,get()没找到或找到多条数据都会引发异常, count()返回查询集合结果数量, first(), last(), exists()

    查询集的缓存

    字段查询

    比较运算符,聚合函数,F对象,Q对象

    语法

    属性名称__比较运算符=值

    外键

    属性名__id

    转义

    类似like语句中使用%是为了匹配占位,如果要匹配%号

    比较运算符

    • exact: 判断,大小写敏感
    • contains:是否包含,大小写敏感
    • startswith, endswith
    • 以上如果在前面加i, 表示不区分大小写
    • isnull, isnotnull
    • in
    • gt, gte, lt, lte
    • year, month, day, hore, minute,
    • 跨关联查询
    • 查询快捷:pk

    聚合函数

    • 使用aggregate函数返回聚合函数的值

    • Avg

    • Count

    • Max

      .aggregate(Max("age"))
      

    F对象

    可以使用模型的A属性和B属性作比较

    filter(xx_gt=F("xxx"))
    

    支持F对象的算术运算

    Q对象

    过滤器的方法中的关键字参数,条件为And模式,Q对象可以用来进行or查询

    Q() | Q()
    ~Q() | Q() # ~表示取反
    

    限制查询集

    返回集是列表,可以用下标限制访问

    数据操作

    python manage.py shell
    from myApp.models import TestClass
    from django.utils import timezone
    TestClass.objects.all() # 查看所有数据
    test_obj = TestClass() # 创建空的对象
    test_obj.name = "test"
    test_obj.save() # 保存信息到数据库
    g = TestClass.objects.get(pk=2) # pk is id
    g.delete() # 从数据库中删除数据
    
    test_obj.field = other_obj # 关联对象
    
    other_obj.TestClass_set.all() # 反向获取关联对象
    stu = grade1.students_set.create(name="test") # 不用先实例化学生对象,然后再关联班级。直接一步执行,保存到数据库
    
    

    django 中mysql的charset配置

    启动服务器

    格式

    python manage.py runserver ip:port
    # ip 不写代表本机IP, 端口号默认8000
    # 这是一个纯python写的轻量级服务器,仅仅在开发测试中使用
    

    Admin站点管理

    概述

    内容发布

    负责添加,修改,删除内容

    公告访问

    配置

    在setting.py文件中的INSTALLED_APPS添加django.contrib.admin

    创建管理员用户:

    python manage.py createsuperuser
    

    修改admin.py文件

    from .models import TestClass
    admin.site.register(TestClass)
    

    自定义管理页面

    # admin.py 文件
    class TestClassAdmin(admin.ModelAdmin):
        list_display = ['pk', 'name'] # 显示字段
        list_filter = [] # 添加过滤器
        search_fields = [] # 添加搜索字段
        list_per_page = []
        
        # 添加,修改页属性
        fields = [] # 规定属性的先后顺序
        fieldsets = [] # 给属性分组, 与fields不能同时使用
    

    关联对象

    class ToBeLinkedClass(admin.TabularInline):
    	model = Students
        extra = 2
    

    布尔值显示问题

    class TestClassAdmin(admin.ModelAdmin):
    def gender(self):
    	if self.gender = True:
    		return "male"
    	else:
    		return "Female"
    	gender.short_description= "gender"
    	action_on_bottom = True # 执行动作显示位置
    

    使用装饰器完成注册

    视图

    在django中,视图对web请求进行回应。视图就是一个python函数,在views.py中设置函数,响应:网页,重定向,错误视图(404, 500),JSON数据

    from django.http import HttpResponse
    
    def index(request):
        return HttpResponse("test view")
    

    配置URL

    修改project目录下的urls.py文件,制定根级urls(settings.py文件中的ROOT_URLCONF)

    
    urlpatterns = [
        url("patterns")
    ] # url实例的列表
    

    在myApp应用目录下创建

    一个urls.py文件

    from. import views

    from django.conf.urls import url
    urlpatterns = [
        url(r"^$]
    
    

    url匹配注意事项:如果要获取url中的值,要在正则中加括号;匹配正则前面不需要反斜杠;

    引入其他url配置

    在应用中创建urls.py, 在工程urls.py文件使用include()

    url的反向解析

    如果在视图,模板中使用了硬编码的链接,url匹配发生改变时,动态生成链接地址

    视图函数

    参数:request, 通过正则表达式获得的参数

    一般在views.py文件中定义

    错误视图

    • 404:url匹配不成功,在templates目录下定义404.html,参数request_path

      配置setting.py, DEBUG:如果为True, 永远不会调用404, ALLOWED...

    • 500: 服务端错误

    • 500:

    • 400: 客户端出现在客户的操作

    HttpResponse对象

    给浏览器返回数据,HttpResponse是由程序员创建

    用法:

    1. 不调用模板
    2. 调用模板,使用render方法
      • 原型,render(request, templateName, [, context])
      • 作用,结合数据和模板,返回一个完整的HTML页面
      • 参数:
        • request:请求体对象
        • templateName:模板名称
        • context: 需要渲染在模板上的数据

    属性:

    • content:表示返回的内容

    • charset:

    • status_code:

    • content-Type:制定输出的MIM

    方法:

    • init
    • write
    • flush:以文件的形式输出缓冲区
    • set_cookie
    • delete_cookie

    子类HttpResponseRedirect, 可以重定向,服务器端的跳转

    子类JsonResponse,异步请求,Ajax, data:字典对象, content-type:application/json

    HttpRequest对象

    服务器接收http请求后,会根据报文创建一个HttpRequest对象,传递给视图的第一个参数

    属性:
    • path: 请求的完成路径,不包含域名和端口
    • method:请求的方式:GET, POST
    • encoding: 表示浏览器提交的数据的编码方式
    • GET:类似于字典的对象,包含了get请求的所有参数
    • POST:类似于字典的对象,包含了POST请求的所有参数
    • FILES:类似于字典的对象,包含了所有上传的文件
    • COOKIES:就是字典,包含所有的cookie
    • session:类似字典的对象,包是当前会话
    方法
    • is_ajax(): 如果是通过XMLHttpRequest发起的
    QueryDict对象

    包括GET,POST,

    方法:get(),根据键获取值, 返回列表最后一个元素;getlist()将键的值以列表形式返回

    状态保持

    http协议是无状态的,每一次请求都是新的请求,实现状态的保持,在客户端或者服务端存储有关会话的数据

    存储方式:

    • cookie: 所有数据存储在客户端,不要存储敏感的数据
    • session:所有的数据存储在服务端,在客户端存储用cookie存储session_id

    目的:在一段时间内,跟踪请求者的状态

    注意:不同的请求者不会共享这个数据

    启用sessiong, 在setting.py文件中设置,默认是启用的

    每个HttpRequest对象都有一个session属性,它就是一个类似字典的对象

    方法:get(key), clear(), flush()删除当前的会话,并删除会话的cookie

    request.session['username'] = username
    
    username = request.session["username"]
    render(request, {"username":username})
    
    from django.contrib.auth import logout 
    
    # 清除session
    
    

    设置过期时间:

    set_exprity(value), value是整数,单位秒;或者时间对象,或者0(关闭浏览器时失效)

    模板

    模板时HTML页面,可以根据视图中传入的数据进行填充

    创建模板

    templates/myApp1

    模板语法

    变量

    要遵守标识符规则,如果使用的变量不存在则插入的是空字符串

    如果调用方法,但不能传入参数

    {{输出值,可以时变量,可以是对象.属性}}

    {{%执行代码%}}

    {%for num in item_num%}

  • ...
  • {%endfor%}

    标签

    语法:{% tag %}

    作用:在输出中创建文本,控制逻辑和循环

    • if

      {% if 表达式 %}
      语句
      {% elif 表达式2 %}
      语句2
      {% else %}
      语句3
      {% endif %}
      
      
      
    • for

      {% for xx in xxx %}
      语句
      {% endfor %}
      
      {% for xx in xxx %}
      语句
      {% empty %}
      语句2 # 列表为空执行
      {% endfor %}
      
      {{forloop.counter}} # 循环的次数
      
      
    • comment

      {% comment %}
      注释多行
      {% endcomment %}
      
    • ifequal, ifnotequal

      {% ifequal value1 value2 %}
      
    • include

      
      
    • url, 作用反向解析

      {% url 'namespace' p1 p2 %}
      
    • csrf_token: 用于跨站请求伪造保护

    • block, extends: 用于模板的继承

    • autodscape:用于html转移

    过滤器

    在变量显示前修改

    • lower, upper, join

    • 可以传递参数,参数用引号引起来

      lst | join:"#"
      
      
    • 如果变量没有被提供,或值为空,提供默认的

      {{test| default: 99}}
      
    • 根据给定时间格式转换为日期字符串

      datavalue | data: 'y-m-d'
      
    • HTML转移

    • 加减, add,

    注释

    单行

    {# 注释内容 #}
    

    反向解析

    <a href='good'> 链接 </a> 
    
    <a href='{% url "app:good"}'
    

    模板继承

    作用:可以减少页面内容的重复定义,实现页面的重用

    block标签:在父模板中预留区域,子模板去填充

    extends标签: 继承模板,写在模板文件的第一行

    {% block main %}
    {% endblock main}
    
    {% extends "xx.html" %}
    {% block main %}
    xxxxx
    {% endblock main}
    
    

    html转义

    将接收到的字符串当成html代码渲染

    code | safe
    autoescape 
    

    跨站请求伪造

    防止CSRF, 在setting.py文件中加入...

    {% csrf_tocken %}
    

    配置模板路径

    修改settings.py文件

    TEMPLATES下DIRS

    将数据传递给模板

    def views_test(request):
    	...
    	lst = [1, 3, 4]
    	return render(request, "..html", {"key1":lst})
    

    高级扩展

    静态文件

    css, font, img, js, json, other

    一般放在staticmyApp文件夹下

    配置setting.py文件

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

    模板文件中动态绑定

    {% load static %}
    <link rel='stylesheet', href= "{% static 'xxx/xxx/xx.css' %}",
    <script src = "{% static 'xxx/xx.js' %}"</script>
    

    中间件

    一个轻量级,底层的创建,可以介入Django的请求和响应

    方法:

    • __init__:不需要传入参数,服务器响应第一个请求的时候调用
    • process_request(),在执行视图前调用,分配url之前,每个请求上都会调用
    • process_view(request, view_args, kwargs):调用视图之前
    • process_template_reponse(request, response):在视图刚好执行完调用, 返回模板之前
    • process_response:最终返回之前
    • process_exception(request, exception):视图抛出异常时调用

    自定义中间件

    继承MiddlewareMixin

    配置setting.py文件

    上传图片

    文件上传中,文件存储在request.FILES属性中

    存储路径static/upfile

    setting.py配置

    上传文件必须是post请求

    分页

    Paginator对象

    返回一个分页对象,属性:num_pages,页码列表,

    方法:page(num), 获得一个Page对象

    异常:InvalidPage, 当page()传入页码无效时

    PageNotAnInteger, EmptyPage,

    Page对象

    属性:object_list,

    方法:

    • has_next(),判断是否有下一页

    • has_revious()

    • next_page_number() 返回下一页的页码

    • previous_page_number()

    all_list = Students.objects.all()
    paginator = Pageinator(all_list, 6)
    page = paginator.get(id)
    return render(request, "../html", {"students":page})
    

    ajax

    需要动态生成,

    富文本

    pip install django-tinymce
    
    
    TINYMCE_DEFAULT_CONF = {
    'theme':'advanced'
    }
    

    创建一个模型类

    继承HTMLField类

    Celery

    用户发起请求,并且要等待response返回,但是视图中有一些耗时操作

    网页一段时间同步一次数据

    解决:将耗时操作放到celery中执行,使用celery定时执行

    概念:

    • 任务:将耗时操作封装成一个函数
    • 队列
    • 工人
    • 代理
    pip install celery
    pip install celery-with-redis
    pip install django-celery
    
    import djcelery
    djcelery.setup_loader()
    BROKER_URL = 'redis://...'
    CELERY_IMPORTS = 
    

    在应用目录下,创建task.py文件

    迁移,生成celery需要的表

    在工程目录下的project目录下创建celery.py

    在工程目录__init__.py文件添加

查看全文
  • 相关阅读:
    jQuery 语法
    HTML DOM Document 对象
    JavaScript
    JavaScript Cookies
    JavaScript 计时事件
    九度OJ 1352 和为S的两个数字
    九度0J 1374 所有员工年龄排序
    九度OJ 1373 整数中1出现的次数(从1到n整数中1出现的次数)
    九度OJ 1370 数组中出现次数超过一半的数字
    九度OJ 1361 翻转单词顺序
  • 原文地址:https://www.cnblogs.com/YajunRan/p/11925280.html
  • Copyright © 2011-2022 走看看