1. 静态文件
1.1 静态文件使用
网页中的css、js、图片等称为静态文件,Django中使用静态文件需要在项目目录下新建static目录进行配置:
- STATICFILES_DIRS设置静态文件所在的物理目录
- STATIC_URL设置模板中访问静态文件对应的url
1.2 静态文件搜索顺序
- 先去配置的静态文件物理路径寻找(STATICFILES_DIRS)
- 再去安装应用目录下寻找static目录
动态生成静态文件的路径:
- 使用{% load staticfiles %}标签加载静态文件配置
- 使用{% static “路径” %}标签拼接静态文件路径(动态生成)
注意:这种方案可以隐藏真实的静态文件路径,但是结合Nginx布署时,会将所有的静态文件都交给Nginx处理,而不用转到Django部分,所以这项配置就无效。
2. 中间件
Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出。中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性,其它的MVC框架也有这个功能,名称为IoC。
Django的中间件类提供了五个方法,分别在于不同的阶段执行,对输入或输出进行干预:
1. __init__(self):无需任何参数,服务器重启后接收第一个请求的时候调用一次,用于确定是否启用当前中间件
2. process_request(self, request):request对象产生之后,url匹配之前调用,返回None或HttpResponse对象
3. process_view(self, request, view_func, *view_args, **view_kwargs):url匹配之后,视图函数调用之前调用,返回None或HttpResponse对象
4. process_response(self, request, response):视图函数调用之后,内容返回给浏览器之前调用,返回HttpResponse对象
5. process_exception(self, request, exception):当视图抛出异常时调用,返回HttpResponse对象
注意:如果注册的多个中间件类中包含process_exception函数的时候,调用的顺序跟注册的顺序是相反的
案例:禁止某些IP访问网站(处理Django的输入和输出过程)
1. 装饰器函数实现(每个页面都加装饰器,任务较大)
# 禁止访问的IP列表
EXCLUDE_IPS = ['192.168.31.157']
# 禁止访问装饰器
def blocked_ips(view_func):
def inner(request, *args, **kwargs):
user_ip = request.META['REMOTE_ADDR'] # 获取用户浏览器ip
if user_ip in EXCLUDE_IPS:
return HttpResponse('<h1>Forbidden</h1>')
else:
return view_func(request, *args, **kwargs)
return inner
2. 自定义中间类实现
- 应用目录下创建middleware.py文件
- 在文件内部编写process_view(self, request, view_func, *view_args, **view_kwargs)函数 (视图函数调用之前调用)
- 注册中间件类,在项目配置文件MIDDLEWARE_CLASSES项注册
from django.http import HttpResponse
# 中间件类
class BlockIpMiddleWare(object):
EXCLUDE_IPS = ['192.168.31.157']
def process_view(self, request, view_func, *view_args, **view_kwargs):
"""中间件函数:视图函数调用前调用"""
user_ip = request.META['REMOTE_ADDR']
if user_ip in BlockIpMiddleWare.EXCLUDE_IPS:
return HttpResponse('<h1>Forbidden</h1>'