Django
一、介绍
1、简介
是用python语言写的开源web开发框架,并遵循MVC设计。
Django的主要目的是简便、快速的开发数据库驱动的网站。
2、特点
1) 重量级框架
2)MVT模式
二、工程搭建
1、创建工程
创建工程命令
django-admin startproject 工程名称
工程目录说明
运行开发服务器
python manage.py runserver ip:端口
或:python manage.py runserver
# 可以不写IP和端口,默认IP是127.0.0.1,默认端口为8000
2、创建子应用
创建
python manage.py startapp 子应用名称
# 例如创建一个user子应用模块
'''
cd ~/Desktop/code/demo
python manage.py startapp users
'''
子应用目录说明
注册安装子应用
注册安装一个子应用的方法,即是将子应用的配置信息文件apps.py中的Config类添加到INSTALLED_APPS列表中。
# 例如
'''
INSTALLED_APPS = [
...
'users.apps.UsersConfig',
]
'''
3、创建视图
创建
# 在views.py中编写视图代码
from django.http import HttpResponse
def index(request):
"""
index视图
:param request: 包含了请求信息的请求对象
:return: 响应对象
"""
return HttpResponse("hello the world!")
'''
说明:
1、视图函数的第一个传入参数必须定义,用于接收Django构造的包含了请求数据的HttpReqeust对象,通常名为request。
2、视图函数的返回值必须为一个响应对象,不能像Flask一样直接返回一个字符串,可以将要返回的字符串数据放到一个HTTPResponse对象中。
'''
定义路由URL
from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls), # django默认包含的
# 添加
url(r'^users/', include('users.urls')),
]
# 使用include来将子应用users里的全部路由包含进工程路由中
# r'^users/' 决定了users子应用的所有路由都已/users/开头,如我们刚定义的视图index,其最终的完整访问路径为/users/index/。
# include函数除了可以传递字符串之外,也可以直接传递应用的urls模块
三、配置、静态文件与路由
1、 配置文件
BASE_DIR
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
DEBUG
本地语言与时区
2、静态文件
3、路由说明
路由定义位置
路由解析顺序
路由命名与reverse反解析(逆向)
路由命名
reverse反解析 使用reverse函数,可以根据路由名称,返回具体的路径,如: from django.urls import reverse # 注意导包路径
def index(request):
return HttpResponse("hello the world!")
def say(request):
url = reverse('users:index') # 返回 /users/index/
print(url)
return HttpResponse('say')
路径结尾斜线/的说明
Django中定义路由时,通常以斜线/结尾,其好处是用户访问不以斜线/结尾的相同路径时,Django会把用户重定向到以斜线/结尾的路径上,而不会返回404不存在 。
urlpatterns = [
url(r'^index/$', views.index, name='index'),
]
四、请求与相应
1、请求
1)URL路径参数
可以使用正则表达式提取参数的方法从URL中获取请求参数,直接传递到视图的传入参数中。
2)QueryDict对象
定义在django.http.QueryDict
HttpRequest对象的属性GET、POST都是QueryDict类型的对象
QueryDict类型的对象用来处理同一个键带有多个值的情况
3)查询字符串
通过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)请求体
请求体数据格式:表单类型字符串、JSON字符串、XML字符串
请求方式:POST/PUT/PATCH/DELETE
表单类型 通过request.POST属性获取,返回QueryDict对象。 def get_body(request): a = request.POST.get(‘a’) b = request.POST.get(‘b’) alist = request.POST.getlist(‘a’) print(a) print(b) print(alist) return HttpResponse(‘OK’) # 重要:request.POST只能用来获取POST方式的请求体表单数据。
非表单类型 通过request.body属性获取最原始的请求体数据,自己按照请求体格式(JSON、XML等)进行解析。request.body返回bytes类型。 # 请求体中的数据 {“a”: 1, “b”: 2}
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')
请求头
request.META为字典类型。
常见的请求头:
其他
2、响应
HttpResponse
django.http.HttpResponse来构造响应对象
HttpResponse(content=响应体, content_type=响应体数据类型, status=状态码)
HttpResponse子类
Django提供了一系列HttpResponse的子类,可以快速设置状态码
JsonResponse
redirect重定向
from django.shortcuts import redirect
def demo_view(request):
return redirect('/index.html')
3、Cookie
特点:
设置Cookie
HttpResponse.set_cookie(cookie名, value=cookie值, max_age=cookie有效期)
# max_age 单位为秒,默认为None。如果是临时cookie,可将max_age设置为None。
读取Cookie
可以通过HttpRequest对象的COOKIES属性来读取本次请求携带的cookie值。request.COOKIES为字典类型。
def demo_view(request):
cookie1 = request.COOKIES.get('itcast1')
print(cookie1)
return HttpResponse('OK')
删除
request.delete_cokkie(键)
4、Session
五、类视图与中间件
1、类视图
定义:使用类来定义的视图
好处:
使用 from django.view.generic import View 配置路由时,使用类视图的as_view()方法来添加
原理 在注册路由规则时类.as_view()返回方法名 在请求路径与正则匹配成功后,方法会被执行 调用dispatch()方法 根据请求方式名称获取方法 执行方法
使用装饰器
在URL配置中装饰 此种方法会为类视图中的所有请求方法都加上装饰器行为,不建议使用
类视图中装饰 method_decorator装饰器使用name参数指明被装饰的方法 # 为全部请求方法添加装饰器 @method_decorator(my_decorator, name=‘dispatch’) class DemoView(View): def get(self, request): print(‘get方法’) return HttpResponse(‘ok’)
def post(self, request):
print('post方法')
return HttpResponse('ok')
# 为特定请求方法添加装饰器
@method_decorator(my_decorator, name='get')
class DemoView(View):
def get(self, request):
print('get方法')
return HttpResponse('ok')
def post(self, request):
print('post方法')
return HttpResponse('ok')
如果需要为类视图的多个方法添加装饰器,但又不是所有的方法(为所有方法添加装饰器参考上面例子),可以直接在需要添加装饰器的方法上使用method_decorator from django.utils.decorators import method_decorator
# 为特定请求方法添加装饰器
class DemoView(View):
@method_decorator(my_decorator) # 为get方法添加了装饰器
def get(self, request):
print('get方法')
return HttpResponse('ok')
@method_decorator(my_decorator) # 为post方法添加了装饰器
def post(self, request):
print('post方法')
return HttpResponse('ok')
def put(self, request): # 没有为put方法添加装饰器
print('put方法')
return HttpResponse('ok')
类视图Mixin扩展类
2、中间件
Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出。
代码实现 定义一个中间件工厂函数,然后返回一个可以别调用的中间件。 中间件工厂函数需要接收一个可以调用的get_response对象。 返回的中间件也是一个可以被调用的对象,并且像视图一样需要接收一个request对象参数,返回一个response对象。 def simple_middleware(get_response): # 此处编写的代码仅在Django第一次配置和初始化的时候执行一次。
def middleware(request):
# 此处编写的代码会在每个请求处理视图前被调用。
response = get_response(request)
# 此处编写的代码会在每个请求处理视图之后被调用。
return response
return middleware
定义好中间件后,需要在settings.py 文件中添加注册中间件 MIDDLEWARE = [ … ‘users.middleware.my_middleware’, # 添加中间件 ] 注意:Django运行在调试模式下,中间件init部分有可能被调用两次。
执行流程
六、模板
1、配置
settings.py配置文件中修改TEMPLATES中的DIRS
2、定义
3、渲染
4、语法
{ {变量}}-变量
{%for%}…{%endfor%}
{%if%}…{%elif%}…{%else%}…{%endif%}
== != < > <= >=比较运算符
and or not布尔运算符
注意:运算符左右两侧不能紧挨变量或常量,必须有空格
变量|过滤器:参数过滤器
5、模板继承
父模板:{%block%}…{%endblock%}
子模板:{%extends “父模板路径”%}
写在子模板文件的第一行
七、数据库
ORM框架:
数据库迁移:
数据库的操作
1.增
2.查
基本查询
过滤查询
过滤条件的表达语法 属性名称__比较运算符=值
F对象 F( 属性名) 属性比较
Q对象 Q(属性名__运算符=值) 实现逻辑或or的查询,需要使用Q()对象结合|运算符 Q对象前可以使用~操作符,表示非not # 例:查询阅读量大于20,或编号小于3的图书,只能使用Q对象实现 from django.db.models import Q BookInfo.objects.filter(Q(bread__gt=20) | Q(pk__lt=3))
聚合函数 使用aggregate()过滤器调用聚合函数,返回字典类型的数据
排序
关联查询
一到多:一对应的模型类对象.多对应的模型类名小写_set b = BookInfo.objects.get(id=1) b.heroinfo_set.all()
多到一:多对应的模型类对象.多对应的模型类中的关系属性名 h = HeroInfo.objects.get(id=1) h.hbook
访问一对应的模型类关联对象的id 多对应的模型类对象.关联类属性_id
关联过滤查询
由多模型类条件查询一模型类数据: 关联模型类名小写__属性名__条件运算符=值
# 例句:查询图书,要求图书中英雄的描述包含"八"
BookInfo.objects.filter(heroinfo__hcomment__contains='八')
由一模型类条件查询多模型类数据: 一模型类关联属性名__一模型类属性名__条件运算符=值
# 查询图书阅读量大于30的所有英雄
HeroInfo.objects.filter(hbook__bread__gt=30)
3.改
4.删
查询集 QuerySet
1、概念:从数据库中获取的对象集合
过滤器方法:
2、特性
3、限制查询集
对查询集进行下标或切片操作,切片后返回新的查询集,不会立即执行
管理器Manageer
1、自定义管理器
八、Admin
使用
1、管理界面本地化
settings.py中设置语言和时间
2、创建超级管理员
python manage.py createsuperuser
> 修改密码:
>
> python manage.py changepassword 用户名
3、App应用配置
在settings.py中INSTALLED_APPS列表中添加此类
4、注册模型类
# 在booktest/admin.py 文件中编写代码:
from django.contrib import admin
from booktest.models import BookInfo,HeroInfo
admin.site.register(BookInfo)
admin.site.register(HeroInfo)
5、定义与使用Admin管理类
定义:继承自admin.ModelAdmin
使用:
编辑
1、调整列表页展示
页大小:list_per_page = 100
操作选项的位置:
列表中的列:list_display = [模型字段1,模型字段2]
将方法作为列:short_description属性 # models.py中: class BookInfo(models.Model): … def pub_date(self): return self.bpub_date.strftime(’%Y年%m月%d日’)
pub_date.short_description = '发布日期' # 设置方法字段在admin中显示的标题
# admin.py中:
class BookInfoAdmin(admin.ModelAdmin):
...
list_display = ['id','btitle','pub_date']
# 说明:
方法列是不能排序的,需要排序:
admin_order_field = 模型类字段
关联对象 在模型类中封装方法,访问关联对象的成员
右侧栏过滤器:list_filter = []
搜索框:search_fields = []
2、调整编辑页展示
3、调整站点信息
4、上传图片
pip install Pillow==4.1.0
配置 MEDIA_ROOT=os.path.join(BASE_DIR,“static_files/media”)
模型类添加字段 class BookInfo(models.Model): … image = models.ImageField(upload_to=‘booktest’, verbose_name=‘图片’, null=True)
# upload_to 指明该字段的图片保存在MEDIA_ROOT目录中的哪个子目录
数据库迁移: python manage.py makemigrations python manage.py migrate
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。