django

# 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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • django中url路由配置及渲染方式

      今天我们学习如何配置url、如何传参、如何命名、以及渲染的方式,内容大致有以下几个方面。

    py3study
  • python之模块和包

    py3study
  • Django的filter查询

    py3study
  • 全球100大科技领导企业榜单出炉,美国数量居冠

    近日,汤森路透 (Thomson Reuters) 发表首份 “全球百大科技领导企业”名单 (The Top 100 Global Technology Lea...

    WZEARW
  • PyQt4 - (2) 第一印象 (pyqt的入门)

    http://www.blogjava.net/glorywine/archive/2008/06/21/206729.html

    bear_fish
  • 昨天,腾讯百万节点规模管控系统(TSC)诞生了!

    腾讯技术工程官方号
  • Hope-Boot开源-低调小熊猫的技术小黑屋

    简体中文 | ??English | 更新日志 | 当前版本:label:0.0.1

    低调小熊猫
  • aws centos7 redis 集群搭建

    版权声明:本文为博主原创文章,转载请写明出处。 ...

    用户1161110
  • 解决运动单例造成Fragment状态被保留的问题

      其实Activiyt、Fragment都是重新构建了的。不过由于对BottomSelectView采取单例构建数据的方式。如果对构建数据做了null判断。第...

    饮水思源为名
  • CentOS系统下安装Redis图文教程

    Redis是C语言开发的,安装Redis需要C语言的环境,如果你的linux系统没有安装界面,那么就需要在线安装C语言环境。这里测试使用的系统是CentOS6....

    itlemon

扫码关注云+社区

领取腾讯云代金券