django

发布时间:2019-05-13 21:33:21编辑:auto阅读(2110)

    # Django
    - 中文教程文档: http://python.usyiyi.cn
    - anaconda使用
    - conda list: 显示当前环境安装的包
    - conda env list: 显示安装的虚拟环境列表
    - conda create -n env_name python=版本号
    - 激活conda的虚拟环境
    - (Linux)source activate env_name
    - (window) activate env_name
    - pip install django==版本号


    ## 创建第一个Django程序流程
    - 命令行下启动Django
    1. django-admin startproject 项目名
    2. cd 项目名
    3. python manage.py runserver
    - pycharm下启动
    1. 需要配置

    ## 路由系统——urls
    - 创建App
    - app: 负责一个具体业务或者一类具体业务的模块
    - 创建: python manage.py startapp app名称

    - 路由
    - 按照具体的请求url,导入相对应的业务处理模块的一个功能模块
    - Django的信息控制中枢
    - 本质上是接收的url和相应的处理模块的一个映射
    - 在接收url请求的匹配上使用了RE(1.8版本)
    - url的具体格式由urls.py所示

    - 1.url匹配规则
    - 子url一旦被调用,则不会返回到主url(不会逆向匹配)
    - 正则依r开头,表示不需要转义,注意尖号(^: 以什么开头)和美元符号($: 以什么结尾)
    - '/one/two/three/' 配对 r'^one/'
    - '/oo/one/two/three/' 不配对 r'^one/'
    - '/one/two/three/' 配对 r'three/$'
    - '/one/two/three/oo/' 不配对 r'three/$'
    - 开头不需要有反斜杠(默认忽略)
    - 如果从上向下都没有找到合适的匹配内容,则报错

    - 2.正常映射
    - 把某一个符合RE的url映射到事务处理函数中去

    - 3.url中带参数映射
    - 在事件处理代码中需要由url传入参数,形如: /myurl/param中的param
    - 参数都是字符串形式,如果需要整数等类型需要自行转换格式

    - 4.url在App中的处理
    - 如果所有应用url都集中 项目名/urls.py 中,可能导致文件的臃肿
    - 可以把urls具体功能逐渐分散到每个App中
    - 从Django.conf.urls 导入 include
    - 注意此时RE部分的写法
    - 添加include导入
    - 使用方法
    - 1. 确保include被导入
    - 2. 写主路由的开头url
    - 3. 写子路由
    - 4. 编写views函数
    - 同样可以使用参数
    - 5.url中的嵌套参数
    - 捕获某个参数的一部分
    - ?: : 表示忽略此参数

    - 6.传递额外参数
    - 参数不仅仅来自url,还可能是我们自己定义的内容

    - 7.url反向解析
    - 防止硬编码
    - 本质上是对每一个url进行命名
    - 以后在编码代码中使用url的值,原则上都应该使用反向解析

    ## 视图
    - 视图即视图函数,接收web请求并返回web响应的事物处理函数
    - 响应指的是符合http协议要求的任何内容,包括json,string,html等

    - 简单视图
    - Django.http给我们提供了很多和httpResponse类似的简单视图
    - 此类视图的使用方法基本类似,可以通过return语句作为直接反馈返回给浏览器
    - Http404为Exception子类,所以需要raise来使用

    - HTTPResponse详解
    - 方法
    - init: 使用页内容实例化HTTPResponse对象
    - write(content): 以文件的方式写
    - flush(): 以文件的方式输出缓存区
    - set_cookie(key, value='', max_age=None, expires=None): 设置Cookie
    - key,value都是字符串类型
    - max_age是一个整数,表示在指定秒数后过期
    - expires是一个datetime或timedelta对象,会话将在这个指定的日期/时间过期,注意datetime和timedelta值只有在使用PickleSeriallizer时才可序列化
    - max_age与expires二选一
    - 如果不指定过期时间,则两个星期后过期
    - delete_cookie(key): 删除指定的key的cookie,如果key不存在则什么也不发生

    - HTTPResponseRedirect
    - 重定向,服务器端跳转
    - 构造函数的第一个参数用来指定重定向的地址

    - Request请求
    - request介绍
    - 服务器接收到http协议的请求后会根据报文创建HTTPRequest对象
    - 视图函数的第一个参数是HTTPRequest对象
    - 在Django.http模块中定义了HTTPRequest对象的API
    - 属性
    - path: 一个字符串,表示请求的页面的完整路径,不包含域名
    - method: 一个字符串,表示请求的使用的http方法,常用值包括: 'GET', 'POST'
    - encoding: 一个字符串,表示提交的数据的编码方式
    - 如果为None则表示使用浏览器的默认设置,一般为utf-8
    - 这个属性是可写的,可以通过修改他来修改访问表单数据使用的编码,接下来对属性的任何访问将使用新的encoding值
    - GET: 一个类似于字典的对象,包含get请求方式的所有参数
    - POST: 一个类似于字典的对象,包含post请求方式的所有参数
    - FILES: 一个类似于字典的对象,包含所有的上传文件
    - COOKIES: 一个标准的Python字典,包含所有的cookie,键和值都为字符串
    - SESSION: 一个既可读又可写的类似于字典的对象,表示当前的会话,只有当Django启用会话的支持时才可用,详细内容见“状态保持”
    - 方法
    - is_ajax(): 如果请求是通过XMLHTTPRequest发起的,则返回True
    - QueryDict对象
    - 定义的django.http.QueryDict
    - request对象的属性GET,POST都是QueryDict类型的对象
    - 于Python字典不同,QueryDict类型的对象用来处理同一个键带有多个值的情况
    - 方法get(): 根据键获取值、只能获取键的一个值、如果一个键同时拥有多个值,则获取最后一个值
    - 方法getlist(): 根据键获取值,将键的值以列表返回,可以获取一个键的多个值
    - GET属性
    - QueryDict类型的对象
    - 包含get请求方式的所有参数
    - 与URL请求地址中的参数对应,位于?后面
    - 参数的格式是键值对,如key1=value1
    - 多个参数之间,使用&连接,如key1=value1&key2=value2
    - 键是开发人员定下来的,值是可变的

    - POST属性
    - QueryDict类型的对象
    - 包含post请求方式的所有参数
    - 与form表单中的控件对应
    - 表单中控件必须有name属性,name为键,value为值
    - CheckBox存在一键多值的问题
    - 键是开发人员定下来的,值是可变的

    - 手动编写视图
    - 实验目的
    - 利用Django快捷函数手动编写视图处理函数
    - 编写过程中理解视图运行原理

    - 分析:
    - Django把所有请求信息封装如request
    - Django通过urls模块把相应的请求跟事件处理函数连接起来,并把request作为参数传入
    - 在相应的处理函数中,我们需要完成两部分
    - 处理业务
    - 把结果封装并返回,我们可以使用简单HTTPRequest,同样也可以自己处理此功能

    - 系统内建视图
    - 可以直接使用


    - Models模型
    - ORM(ObjectRelationMap)
    - 把面向对象思想转换成关系数据库思想,操作上把类等价于表格
    - 类对应表
    - 类中的属性对应表中的字段
    - 在应用中的model.py文件中定义class
    - 所有需要使用ORM的class都必须是 model.Model 的子类
    - 字段的类型都必须使用 model.xx 不能使用Python中的类型
    - 在Django中,models负责跟数据库交互
    - Django连接数据库
    - 自带默认数据库sqllite3
    - 关系型数据库
    - 轻量级
    - 建议开发的时候使用sqllite3,部署用mysql之类的数据库
    - 切换数据库在settings中进行设置
    # django连接mysql
    DATABASE = [
    'defalut': {
    'ENGINE' : 'django.db.backends.mysql',
    'NAME' : '数据库名',
    'PASSWORD' : '数据库密码',
    'HOST' : '数据库地址',
    'PORT' : '数据库端口号',
    }
    ]
    - 需要在项目文件下的__init__文件中导入pymysql包

    # 在主项目中的__init__文件中
    import pymysql
    pymysql.install_as_MYSQLdb()

    - 数据库的迁移
    1. 在命令行中,生成数据迁移的语句(生成sql语句)
    python manage.py makemigrations
    2. 在命令行中,输入数据迁移的指令
    python manage.py migrate
    # 如果迁移中出现没有变化或者报错,可以尝试强制迁移
    python manage.py makemigrations 应用名
    python manage.py migrate 应用名
    3. 对于默认数据库,为了避免出现混乱,如果数据库中没有数据,每次迁移前可以把系统自带的sqllite3数据库删除


    ### 查看数据库中的数据
    - 启动命令行: python3 manage.py shell
    - 在命令行中导入相对应的映射类
    - from 应用名.models import 类名
    - 使用objects属性操作数据库.objects

    - 常见的查找方法
    1. 通用查找格式: 属性名__(用下列内容) = 值
    - gt: 大于
    - gte: 大于等于
    - lt: 小于
    - lte: 小于等于
    - range: 范围
    - year: 年份
    - isnull: 是否为空
    2. 查找等于指定值的格式: 属性名 = 值
    3. 模糊查找: 属性名__(用下列内容) = 值
    - exact: 精确大小
    - iexact: 不区分大小写
    - contains: 包含
    - startwith: 以...开始
    - endwith: 以...结尾

    ## 数据库表关系
    - 多表联查,利用多个表联合查找某一项信息或者多项信息



    ## 模板系统
    - 步骤:
    - 在settings中进行设置: TEAMPLATES
    - 在teampltaes文件夹下编写模板并调用
    - 模板-变量
    - 变量的表示方法{{var_name}}
    - 在系统调用模板的时候,会用相应的数据查找相应的变量名称,如能找到,则填充,否则跳过

    - 模板-标签
    - for标签: {%for..in..%}
    - 用法:
    {% for..in..%}
    循环语句
    {% endfor %}

    - if标签:
    - 用法:
    {% if 条件 %}
    条件成立执行语句
    {% elif 条件 %}
    条件成立执行语句
    {% else %}
    以上条件都不成立执行语句
    {% endif %}

    - csrf标签:
    - csrf(跨站请求伪造)
    - 在提交表单的时候,表单页面需要加上{% csrf_token %}


    ## session(为了应对HTTP协议的无状态性)
    - 用来保存用户比较敏感的信息
    - 属于request的一个属性
    - 常用操作:
    - request.session.get(key, defaultValue)
    - request.session.clear(): 清除全部
    - request.session[key] = value: 赋值
    - request.session.flush(): 删除当前会话并且清除会话的cookie
    - del request.session[key]: 也是删除


    ## 分页
    - django提供现成的分页器来对结果进行分页
    - from django.core.paginator import Paginator

    ## 基于类的视图
    - 可以针对HTTP协议不同的方法创建不同的函数
    - 可以使用Mixin等oop技术
    - Mixin
    - 把来自父类的行为或者属性组合在一起
    - 解决多重继承问题
    - ListView



    ## admin
    - 创建Admin
    - settings.py中填入app
    - 打开urls.py
    - 创建超级用户python manage.py createsuperuser
    - 配置settings文件
    - 绑定管理模型
    - 在admin.py中from jokeiApp.models import ClassRoom, Student, Teacher
    - 然后进行绑定admin.site.register(Student)
    - 设置admin管理类
    - 实现方法
    - AdminInfo
    - 装饰器
    - 修改页面显示数量: list_per_page
    - 操作选项: actions_on_top/button
    - 控制列表中显示的内容: list_display=[]
    - 将方法作为列显示
    - 函数必须返回值
    - 设置short_descraption作为显示内容
    - 排序使用admin_order_field

关键字