Django框架进阶

Django框架进阶

Django的URL路由机制

URL -> 定义、转换、传参、命名等 -> views

Django的URL路由配置

路由是关联URL及其处理函数关系的过程

settings.py文件中ROOT_URLCONF变量指定全局路由文件名称

1
ROOT_URLCONF = '<工程名称>.urls' # 默认对应工程目录下urls.py文件

Django使用urlpatterns 变量表示路由 (urls.py),该变量是列表类型,由 path() 或 re_path() 作为元素组成

1
2
3
4
urlpatterns = [
path('msggate/', include('msgapp.urls')),
path('admin/', admin.site.urls),
]

Django的URL路由流程

路由是关联URL及其处理函数关系的过程

  • (1) Django查找全局 urlpatterns 变量 (urls.py)
  • (2) Django按照先后顺序,对URL逐一匹配urlpatterns每个元素
  • (3) 在找到第一个匹配时,停止查找,根据匹配结果执行对应处理函数
  • (4) 如果没有找到匹配或出现异常,Django进行错误处理

注意:

  • Django的路由不考虑HTTP请求方式,仅根据URL进行路由,即,
  • 只要URL相同,无论POST、GET等哪种请求方式都指向同一个操作函数

路由:path() 和 re_path()

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

Django的视图响应类型

视图函数编写原则

视图函数接受HTTP请求并返回响应,可以放在任何地方,可以是任何功能

  • 视图函数可以返回Web文本、页面、重定向、错误、图片等任何内容
  • 视图函数通过HttpResponse、JsonResponse等类表达并返回响应
  • 按约定,视图函数放在对应app中的views.py文件中

Django的响应类型

django.http包含所有响应类型

  • HttpResponse类及子类 (共10个)
  • JsonResponse类
  • StreamingHttpResponse类
  • FileResponse类

1

1

1

修改cloudms:

HttpResponse类:

1
2
3
4
5
6
7
8
from django.contrib import admin
from django.urls import include, path
from msgapp import views as msgviews
urlpatterns = [
path('msggate/', include('msgapp.urls')),
path('admin/', admin.site.urls),
path('', msgviews.homeproc),
]
1
2
def homeproc(request):
return HttpResponse("<h1>这是首页,具体功能请访问<a href='./msggate'>这里</a></h1>")
1
2
3
4
5
def homeproc(request):
response = HttpResponse()
response.write("<h1>这是首页,具体功能请访问<a href='./msggate'>这里</a></h1>")
response.write("<h1>这是第二行</h1>")
return response

JsonResponse类

1

1
2
3
def homeproc1(request):
response = JsonResponse({'key1': 'value1'})
return response

StreamingHttpResponse类

1

FileResponse类

1

1
2
3
4
5
6
def homeproc2(request):
cwd = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
response = FileResponse(open(cwd + "/msgapp/templates/PyLogo.png", "rb"))
response['Content-Type'] = 'application/octet-stream'
response['Content-Disposition'] = 'attachment;filename="pylogo.png"'
return response

Django请求类型的判断

django.views.decorators.http

  • 路由不能判断HTTP请求的类型
  • Django通过decorators在视图函数前进行基本判断,
1
2
3
4
5
6
7
from django.views.decorators.http import require_http_methods

@require_http_methods(["GET", "POST"])
def my_view(request):
# I can assume now that only GET or POST requests make it this far
# ...
pass

Django的视图流式响应机制

1

实例:文件下载

HttpResponse方式

1
2
3
4
5
def file_download(request):
# do something...
with open('data.txt') as f:
c = f.read()
return HttpResponse(c)

文件内容一次性响应,仅适合小文件

StreamingHttpResponse方式

  • 将文件分段,每次传输一部分,分段大小可调
  • 利用Python的迭代器产生分段
  • 可以是文件,也可以是任何大规模数据响应
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from django.http import StreamingHttpResponse

def big_file_download(request):
# do something...
def file_iterator(file_name, chunk_size=512):
with open(file_name) as f:
while True:
c = f.read(chunk_size)
if c:
yield c
else:
break
fname = "data.txt"
response = StreamingHttpResponse(file_iterator(fname))
return response

FileResponse方式

  • FileResponse是StreamingHttpResponse的子类
  • 自动分段、自动迭代,适合二进制文件传输
1
2
3
4
5
6
def homeproc2(request):
cwd = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
response = FileResponse(open(cwd + "/msgapp/templates/PyLogo.png", "rb"))
response['Content-Type'] = 'application/octet-stream'
response['Content-Disposition'] = 'attachment;filename="pylogo.png"'
return response

MIME标记

1

Django的模板引擎与模板使用

Django的模板引擎

模板引擎是模板响应的后端

模板引擎的配置

settings.py文件中对模板引擎进行配置 (BACKEND)

1

模板目录在列表中的顺序是搜索模板的顺序

1

1

1

1

1

1

Django模板语言入门

模板语言:指导模板加载数据方式的工具

DTL: Django Template Language

1

1

1

1

1

Donate? comment?