day5

中间件的应用

整个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),
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. cookie 和 session HTTP 协议是一个""无法保持状态""的协议,如果需要"保持状态''记录...
    十二右阅读 378评论 0 0
  • Day5 Linux文件及目录管理命令基础 pwd:显示当前所在位置信息 cd: 切换目录 cd的常用选项: cd...
    念九i_58期康旭阅读 181评论 0 0
  • day5 - webpack 在网页中会引用那些常见的静态资源? JS.js .jsx .coffee .ts(T...
    小浅_阅读 320评论 0 0
  • 最常用的\" \’ 单引号 \” 双引号 \\ 反斜杠 \0 空 \a 警告 \b 退格 \f 换页 \n 换行 ...
    VincentHK阅读 373评论 0 0
  • 再好的朋友,不聯系也會散。 我的朋友們,我們良久沒聯系了。不是感情變了,而是我們的糊口變了,究竟春秋增長了,肩負的...
    智在必得丶阅读 497评论 0 0