中间件的应用
整个Web应用中扮演了拦截过滤器的角色
Django项目的配置文件中就包含了对中间件的配置
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
自定义中间件
基于函数的实现方式
"""
middlewares.py
"""
from django.shortcuts import redirect
def check_login_middleware(func):
def wrapper(request, *args, **kwargs):
# 获取请求的资源路径
path = request.path
# 如果请求的资源路径在设定的元组中就表示需要登录验证
if path in ('/vote/praise/', '/vote/criticize/'):
if 'username' not in request.session:
# session中没有username就重定向到登录页
return redirect('login')
return func(request, *args, **kwargs)
return wrapper
修改配置文件,激活中间件使其生效。
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'debug_toolbar.middleware.DebugToolbarMiddleware',
'vote.middlewares.check_login_middleware',
]
下载
def export_teachers_pdf(request):
# 获取文件绝对路径
path = os.path.dirname(__file__)
# 连接文件地址
filename = os.path.join(path,'resources\Python全栈+人工智能.pdf')
file_stream = open(filename,'rb')
# 迭代器iter
file_iter = iter(lambda:file_stream.read(1024),b'')
# 流式传输:降低服务器开销
resp = StreamingHttpResponse(file_iter,content_type='application/pdf')
# 将单个字符串编码转化为 % xx的形式,有中文时使用
filename = quote('Python全栈+人工智能.pdf')
resp['content-disposition'] = f'inline;filename="{filename}"'
# 文件打开
return resp
def export_teachers_excel(request):
# 动态取对象属性
# 创建表
wb = xlwt.Workbook()
sheet = wb.add_sheet('老师信息表')
queryset = Teacher.objects.all()
colnames = ('姓名','介绍','好评数','差评数','学科')
# enumerate 获得下标
for index,name in enumerate(colnames):
sheet.write(0,index,name)
# 写入第一行
props = ('name','detail','good_count','bad_count','subject')
# 循环控制列写入
for row,teacher in enumerate(queryset):
# 循环控制行写入
for col,prop in enumerate(props):
#动态获得属性
value = getattr(teacher,prop,'')
if isinstance(value,Subject):
value = value.name
sheet.write(row+1,col,value)
# 将Excel文件的二进制数据写入内存
buffer = BytesIO()
wb.save(buffer)
# 通过HttpResponse对象向浏览器输出Excel文件大文件的流式处理:StreamingHttpResponse
resp = HttpResponse(buffer.getvalue(),content_type='application/msexcel')
filename = quote('老师.xls')
# 如果文件名有中文需要处理成百分号编码
resp['content-disposition'] = f'attachment;filename="{filename}"'
return resp
# path('excel/',views.export_teachers_excel),
# path('pdf/',views.export_teachers_pdf),