DRF框架小结

Python web框架要点

web 应用程序的本质:
1、接收并解析HTTP请求,获取具体的请求信息
2、处理本次的HTTP请求,即完成本次请求的业务逻辑处理
3、构造并返回处理结果 —— HTTP响应

Django介绍

特点:
1、提供项目工程管理的自动化脚本工具
2、数据库orm支持(对象管理映射)
3、模板
4、表单
5、Admin管理站点
6、文件管理
7、认证权限
8、session机制
9、缓存
MVT模式:
核心思想:分工、解耦,让不同的代码块之间降低耦合,增强代码的可扩展性和可移植性,实现向后兼容。(高聚合,低耦合)

创建Django工程:

django-admin startproject 工程名称
运行服务器的命令:
python manage.py runserver (ip:端口)
ip和端口可省略,默认为:127.0.0.1,:8000

创建子应用:

1、 python manage.py startapp 子应用名称(此时manage.py是创建工程时自动生成的管理文件)
文件类型说明:

  • admin.py:跟网站的后台管理站点配置相关
  • app.py :用于配置当前子应用的相关信息
  • migrations:该目录用于存放数据库迁移历史文件
  • models.py:用于存放数据库模型类
  • test.py:用于开发测试用例,编写单元测试
  • views.py:编写web应用视图
    2、创建出来的子应用目录文件虽然被放到了工程项目目录中,但是django工程并不能立即直接使用该子应用,需要注册安装后才能使用。
    即:将子应用的配置信息文件apps.py中的Config类添加到INSTALLED_APPS列表中。

创建视图

Django视图定义在views文件中

视图函数的第一个传入的参数必须定义,用于接受Django构造的包含了请求数据的HttpReqeust对象,通常名为request。

定义路由URL

  • 在子应用中新建一个urls.py的文件用于存放该应用的路由。
  • 在users/urls.py文件中定义路由信息:格式:url(路径, 视图)
    url(r’^index/$’, views.index),
  • 在工程总路由demo/urls.py中添加子应用的路由数据:格式:url(r’^users/’, include(‘users.urls’))
  • 重新启动运行Django程序:python manage.py runserver

配置静态文件与路由

配置文件

1、BASE_DIR:BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(file))),当前工程的根目录,Django会依此来定位工程内的相关文件,我们也可以使用该参数来构造文件路径。
2、DEBUG:线上运行时不能在此模式下运行,修改为Flase, Django在调试模式下默认不提供静态文件服务
3、本地语言与时区:简体中文和上海

静态文件

为提供静态文件,需要配置两个参数
STATICFILES_DIRS 存放查找静态文件的目录
STATIC_URL 访问静态文件的URL前缀
步骤:

  • 在项目根目录下创建static_files目录来保存静态文件
  • 在demo/settings.py中修改静态文件的两个参数STATIC_URL = ‘/static/’
    STATICFILES_DIRS = [
    os.path.join(BASE_DIR, ‘static_files’)]
  • 此时在static_files添加的任何静态文件都可以使用网址 /static/文件在static_files中的路径 来访问了

路由说明

1、路由定义位置
两种方式:

  • Django的主要路由信息定义在工程同名目录下的urls.py文件中,该文件是Django解析路由的入口。
    每个子应用为了保持相对独立,可以在各个子应用中定义属于自己的urls.py来保存该应用的路由。然后用主路由文件包含各应用的子路由数据

  • 也可将工程的全部路由信息都定义在主路由文件中,子应用不再设置urls.py

2、路由解析顺序
Django在接收到一个请求时,从主路由文件中的urlpatterns列表中以由上至下的顺序查找对应路由规则,如果发现规则为include包含,则再进入被包含的urls中的urlpatterns列表由上至下进行查询。值得关注的由上至下的顺序,有可能会使上面的路由屏蔽掉下面的路由,带来非预期结果。
3、 路由命名

  • 在使用include函数定义路由时,可以使用namespace参数定义路由的命名空间:命名空间的作用:避免不同应用中的路由使用了相同的名字发生冲突,使用命名空间区别开。url(r’^users/’, include(‘users.urls’, namespace=‘users’)),
  • 在定义普通路由时,可以使用name参数指明路由的名字
    4、reverse反解析
    使用reverse函数,可以根据路由名称,返回具体的路径

5、路径结尾斜线/的说明

  • Django中定义路由时,通常以斜线/结尾,其好处是用户访问不以斜线/结尾的相同路径时,Django会把用户重定向到以斜线/结尾的路径上,而不会返回404不存在
  • 虽然路由结尾带/能带来上述好处,但是却违背了HTTP中URL表示资源位置路径的设计理念。是否结尾带/以所属公司定义风格为准。

app应用配置

  • 在每个应用目录中都包含了apps.py文件,用于保存该应用的相关信息。
    在创建应用时,Django会向apps.py文件中写入一个该应用的配置类

  • 我们将此类添加到工程settings.py中的INSTALLED_APPS列表中,表明注册安装具备此配置属性的应用。
    AppConfig.name 属性表示这个配置类是加载到哪个应用的,每个配置类必须包含此属性,默认自动生成。
    AppConfig.verbose_name 属性用于设置该应用的直观可读的名字,此名字在Django提供的Admin管理站点中会显示:class UsersConfig(AppConfig):
    name = ‘users’
    verbose_name = ‘用户管理’

请求与响应

请求request传递参数

向服务器传参的几种路径:
提取URL的特定部分,如/weather/beijing/2018,可以在服务器端的路由中用正则表达式截取;
查询字符串(query string),形如key1=value1&key2=value2;
请求体(body)中发送的数据,比如表单数据、json、xml;
在http报文的头(header)中。

1、url路径参数

  • 在定义路由URL时,可以使用正则表达式提取参数的方法从URL中获取请求参数,Django会将提取的参数直接传递到视图的传入参数中。

2、Django中的QueryDict对象

  • HttpRequest对象的属性GET、POST都是QueryDict类型的对象
  • 方法get():如果一个键同时拥有多个值将获取最后一个值
  • 方法getlist():根据键获取值,值以列表返回,可以获取指定键的所有值

3、查询字符串Query String
获取请求路径中的查询字符串参数(形如?k1=v1&k2=v2),可以通过request.GET属性获取,返回QueryDict对象。:例如:
#/qs/?a=1&b=2&a=3
def qs(request):
a = request.GET.get(‘a’)
b = request.GET.get(‘b’)
alist = request.GET.getlist(‘a’)
print(a) # 3
print(b) # 2
print(alist) # [‘1’, ‘3’]
return HttpResponse(‘OK’)
注意:查询字符串不区分请求方式,即假使客户端进行POST方式的请求,依然可以通过request.GET获取请求中的查询字符串数据。

4、请求体
可以发送请求体数据的请求方式有POST、PUT、PATCH、DELETE
Django默认开启了CSRF防护,会对上述请求方式进行CSRF防护验证,在测试时可以关闭CSRF防护机制,方法为在settings.py文件中注释掉CSRF中间件

  • 表单类型 Form Data
  • 非表单类型:Non-Form Data
    Django无法自动解析,可以通过request.body属性获取最原始的请求体数据,自己按照请求体格式(JSON、XML等)进行解析。request.body返回bytes类型。

import json

def get_body_json(request):
json_str = request.body
json_str = json_str.decode() # python3.6 无需执行此步
req_data = json.loads(json_str)
print(req_data[‘a’])
print(req_data[‘b’])
return HttpResponse(‘OK’)

5、请求头:
可以通过request.META属性获取请求头headers中的数据,request.META为字典类型

6、其他常用的HttpRequest对象属性
method:一个字符串,表示请求使用的HTTP方法,常用值包括:‘GET’、‘POST’。
user:请求的用户对象。
path:一个字符串,表示请求的页面的完整路径,不包含域名和参数部分。
encoding:一个字符串,表示提交的数据的编码方式。
如果为None则表示使用浏览器的默认设置,一般为utf-8。
这个属性是可写的,可以通过修改它来修改访问表单数据使用的编码,接下来对属性的任何访问将使用新的encoding值。
FILES:一个类似于字典的对象,包含所有的上传文件。

响应 Response

HttpRequest对象由Django创建,HttpResponse对象由开发人员创建。

  • HttpResponse
    1、可以使用django.http.HttpResponse来构造响应对象。
    HttpResponse(content=响应体, content_type=响应体数据类型, status=状态码)
    2、也可通过HttpResponse对象属性来设置响应体、响应体数据类型、状态码
    例如:
    from django.http import HttpResponse
    def demo_view(request):
    return HttpResponse(‘itcast python’, status=400)
    或者
    response = HttpResponse(‘itcast python’)
    response.status_code = 400
    response[‘Itcast’] = ‘Python’
    return response

  • HttpResponse子类

  • JsonResponse
    若要返回json数据,可以使用JsonResponse来构造响应对象
    作用:帮助我们将数据转换为json字符串
    设置响应头Content-Type为 application/json

  • redirect重定向

cookie

  • 设置cookie:通过HttpResponse对象中的set_cookie方法,HttpResponse.set_cookie(cookie名, value=cookie值, max_age=cookie有效期)
    response.set_cookie(‘itcast1’, ‘python1’) # 临时cookie
    response.set_cookie(‘itcast2’, ‘python2’, max_age=3600) # 有效期一小时

  • 读取Cookie
    可以通过HttpRequest对象的COOKIES属性来读取本次请求携带的cookie值。request.COOKIES为字典类型。

session

Django项目默认启用Session。

  • session默认存储在数据库中:SESSION_ENGINE=‘django.contrib.sessions.backends.db’
  • 本地缓存:SESSION_ENGINE=‘django.contrib.sessions.backends.cache’
  • 混合存储,优先从本机内存中存取,如果没有则从数据库中存取。:SESSION_ENGINE=‘django.contrib.sessions.backends.cached_db’
  • redis,在redis中保存session,需要引入第三方扩展,我们可以使用django-redis来解决
  • session操作
    1、写入:request.session[‘键’]=值
    2、读取:request.session.get(‘键’,默认值)
    3、清除所有的session(删除值部分):request.session.clear()
    4、清除session数据(删除整条数据):request.session.flush()
    5、删除session中的指定键及值:del request.session[“键”]
    6、设置session有效期:request.session.set_expiry(value),
    value 为None,默认有效期为两周,有值时,单位为秒。为0时:关键浏览器时过期

类视图

类视图的好处:
代码可读性好
类视图相对于函数视图有更高的复用性, 如果其他地方需要用到某个类视图的某个特定逻辑,直接继承该类视图即可

  • 类视图的使用
    定义类视图需要继承自Django提供的父类View,可使用from django.views.generic import View或者from django.views.generic.base import View 导入
    配置路由时,使用类视图的as_view()方法来添加
  • 类视图使用装饰器
    1、在url配置中装饰:此种方式最简单,但因装饰行为被放置到了url配置中,单看视图的时候无法知道此视图还被添加了装饰器,不利于代码的完整性,不建议使用。
    2、在类视图中装饰:在类视图中使用为函数视图准备的装饰器时,不能直接添加装饰器,需要使用method_decorator将其转换为适用于类视图方法的装饰器。
    method_decorator装饰器还支持使用name参数指明被装饰的方法
    3、构造Mixin扩展类

中间件

可以使用中间件,在Django处理视图的不同阶段对输入或输出进行干预。
- 定义方法:定义一个中间件工厂函数,然后返回一个可以被调用的中间件中间件工厂函数需要接收一个可以调用的get_response对象。返回的中间件也是一个可以被调用的对象,并且像视图一样需要接收一个request对象参数,返回一个response对象

  • 多个中间件执行顺序:
    在请求视图被处理前,中间件由上至下依次执行
    在请求视图被处理后,中间件由下至上依次执行

数据库

orm:django中内嵌了ORM框架,不需要直接面向数据库编程,而是定义模型类,通过模型类和对象完成数据表的增删改查操作。
使用django进行数据库开发的步骤:

  • 配置数据库链接信息
  • 在models.py中定义模型类
  • 进行数据库的迁移
  • 通过类和对象完成数据库的增删改查操作

配置

Django默认使用sqlite数据库,

  • 使用MySql数据库首先需要安装驱动程序:pip install PyMySQL
  • 在django工程同名子目录的__init__.py文件中添加语句:from pymysql import install_as_MySQLdb
    install_as_MySQLdb(),作用是:让Django的ORM能以mysqldb的方式来调用PyMySQL
  • 修改DATABASES配置信息:
  • 在mysql中创建数据库

定义模型类

模型类被定义在"应用/models.py"文件中。
模型类必须继承自Model类,位于包django.db.models中

  • 定义:创建子应用,在models.py中定义模型类
  • 迁移,生成迁移文件:python manage.py makemigrations;同步到数据库中:python manage.py migrate
  • 添加测试数据,

演示工具使用

  • shell工具:Django的manage工具提供了shell命令,帮助我们配置好当前工程的运行环境(如连接好数据库等),以便可以直接在终端中执行测试python语句。命令:python manage.py shell; 导入模型类,以便使用
  • 查看mysql数据库日志

数据库的操作

  • 增:
    • 1、save:通过创建模型类对象,执行对象的save()方法保存到数据库;
    • 2、通过模型类.objects.create()保存。
  • 查:
    • get 查询单一结果,如不存在则会抛出模型类.DoesNotExist异常;all 查询多个结果
    • 过滤查询:
      • 相等:exact:BookInfo.objects.filter(id_exact=1),可简写BookInfo.objects.filter(id=1)
      • 模糊查询:contains:是否包含;startswith、endswith:以指定值开头或结尾。
      • 空查询:isnull:是否为null。
      • 范围查询:in: BookInfo.objects.filter(id_in=[1, 3, 5])
      • 比较查询:gt 大于 (greater then)
        gte 大于等于 (greater then equal)
        lt 小于 (less then)
        lte 小于等于 (less then equal)
      • 日期查询:year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算。
    • F对象:先从django.db.models中导入:BookInfo.objects.filter(bread_gte=F(‘bcomment’))
    • Q对象:同样需要先导入,Q对象可以使用&、|连接,&表示逻辑与,|表示逻辑或;Q对象前可以使用~操作符,表示非not。
      • BookInfo.objects.filter(Q(bread_gt=20) | Q(pk_lt=3));BookInfo.objects.filter(~Q(pk=3))
    • 排序:order_by
  • 修改:
    • save,修改模型类的属性,执行save()方法
    • update,使用模型类.objects.filter().update(),会返回受影响的行数
  • 删除
    • 执行模型里对象的delete()方法
    • 模型类.objects.filter().delete()

查询集 QuerySet

查询集,也称查询结果集、QuerySet,表示从数据库中获取的对象集合。

  • 两大特性:
    • 惰性执行
    • 缓存
  • 限制查询集:对查询集进行切片后返回一个新的查询集,不会立即执行查询。

模板

配置

  • 在工程中创建目录templates
  • 在settings.py配置文件中修改TEMPLATES配置项的DIRS值

定义模板

在templates目录中创建一个模板文件,如:index.html

模板渲染:

Django提供了一个函数render:render(request对象, 模板文件路径, 模板数据字典)
from django.shortcuts import render
def index(request):
context={‘city’: ‘北京’}
return render(request,‘index.html’,context)

模板语法

  • 模板变量
  • 模板语句
  • 过滤器
  • 注释
  • 模板继承

Admin站点

  • Django能够根据定义的模型类自动地生成管理页面。

使用django的管理模块,步骤:

  • 1、管理界面本地化
  • 2、创建管理员,:python manag.py createsuperuser
  • 3、注册模型类:admin.site.register(BookInfo)
  • 4、自定义管理页面,定义管理类需要继承自admin.ModelAdmin类

你可能感兴趣的:(项目)