django框架的中间件

高级

到此为止,关于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__(
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值