高级
到此为止,关于Django框架的三大块M、V、T已经全部讲完了,接下来学习一些其它的知识点,这些知识点不在三大块范围内,Django提供了这些功能后,可以帮助我们更快更好的完成开发。
主要知识点如下:
-
静态文件处理
-
中间件
-
上传图片
-
Admin站点
-
分页
-
示例:省市区选择,jquery,ajax
1、创建示例项目
1)创建项目demo5。
django-admin startproject demo5
2)进入项目目录demo5,创建应用app1。
cd test5 python manage.py startapp app1
3)在demo5/settings.py中INSTALLED_APPS项安装应用。
4)在demo5/settings.py中DATABASES项配置使用MySQL数据库demo5。
5)在demo5/settings.py中TEMPLATES项配置模板查找路径。
6)创建模板目录结构如下:
7)打开demo5/urls.py文件,包含app1的url配置。
8)在app1/目录下创建urls.py,配置url。
from django.conf.urls import url from app1 import views urlpatterns=[ url(r'^$',views.index), ]
10)打开app1/views.py文件,定义视图index。
from django.shortcuts import render def index(request): return render(request,'app1/index.html')
11)在templates/app1目录下创建文件index.html,代码如下:
<html> <head> <title>常用技术练习</title> </head> <body> <h1>今天学习常用的技术</h1> </body> </html>
12)打开app1/models.py文件,定义模型类AeraInfo,结构参照第二部分设计。
from django.db import models #定义地区模型类,存储省、市、区县信息 class AreaInfo(models.Model): atitle=models.CharField(max_length=30)#名称 aParent=models.ForeignKey('self',null=True,blank=True)#父级
1、静态文件
项目中的CSS、图片、js都是静态文件。一般会将静态文件放到一个单独的目录中,以方便管理。在html页面中调用时,也需要指定静态文件的路径,Django中提供了一种解析的方式配置静态文件路径。静态文件可以放在项目根目录下,也可以放在应用的目录下,由于有些静态文件在项目中是通用的,所以推荐放在项目的根目录下,方便管理。
示例
1)在demo5/settings.py文件中定义静态文件存放的物理目录。
STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static'), ]
2)在项目根目录下创建static目录,再创建img、css、js目录。
3)在app1/views.py中定义视图static_test。
def static_test(request): return render(request,'app1/static_test.html')
4)在app1/urls.py中配置url。
url(r'^static_test/$',views.static_test),
5)在templates/app1/下创建static_test.html文件。
<html> <head> <title>静态文件</title> </head> <body> <img src="/static/img/sta.png"/> </body> </html>
6)保存图片到static/img/目录下,名称为sta.png。
7)运行服务器,浏览效果如下图:
配置静态文件
Django提供了一种配置,可以在html页面中可以隐藏真实路径。
1)在demo5/settings.py文件中修改STATIC_URL项。
# STATIC_URL = '/static/' STATIC_URL = '/abc/'
2)刷新浏览器,图片找不到了,效果如下图:
3)修改templates/app1/static_test.html如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>静态文件</title> </head> <body> <h1>下面没有修改的图片</h1> <img src="static/img/sta.jpg" alt=""> <hr> <h1>下面是修改路径后的图片</h1> <img src="aaa/img/sta.jpg" alt=""> </body> </html>
3)刷新浏览器,效果如下图:
4)查看网页源代码,发现可以网址和真实地址之间没有关系。
为了安全可以通过配置项隐藏真实图片路径,在模板中写成固定路径,后期维护太麻烦,可以使用static标签,根据配置项生成静态文件路径。
1)修改templates/app1/static_test.html如下:
<html> <head> <title>静态文件</title> </head> <body> 修改前:<img src="/static/img/sg.png"/> <hr> 修改后:<img src="/abc/img/sg.png"/> <hr> 动态配置: {%load static from staticfiles%} <img src="{%static "img/sg.png" %}"/> </body> </html>
2)刷新浏览器
查看网页源代码如下图:
说明:这种方案可以隐藏真实的静态文件路径,但是结合Nginx布署时,会将所有的静态文件都交给Nginx处理,而不用转到Django部分,所以这项配置就无效了。
2、中间件
Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出。中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性,其它的MVC框架也有这个功能,名称为IoC。
Django在中间件中预置了五个方法,这五个方法的区别在于不同的阶段执行,对输入或输出进行干预,方法如下:
1)初始化:无需任何参数,服务器响应第一个请求的时候调用一次,用于确定是否启用当前中间件。
def __init__(self): pass
2)处理请求前:在每个请求上,request对象产生之后,url匹配之前调用,返回None或HttpResponse对象。
def process_request(self, request): pass
3)处理视图前:在每个请求上,url匹配之后,视图函数调用之前调用,返回None或HttpResponse对象。
def process_view(self, request, view_func, *view_args, **view_kwargs): pass
4)处理响应后:视图函数调用之后,所有响应返回浏览器之前被调用,在每个请求上调用,返回HttpResponse对象。
def process_response(self, request, response): pass
5)异常处理:当视图抛出异常时调用,在每个请求上调用,返回一个HttpResponse对象。
def process_exception(self, request,exception): pass
示例
中间件是一个独立的python类,,可以定义这五个方法中的一个或多个。
1)在app1/目录下创建middleware.py文件,代码如下:
class MyMedd: def __init__(