美文网首页
Django高级使用

Django高级使用

作者: 铅笔与旧友 | 来源:发表于2018-09-20 21:23 被阅读0次

    一、静态文件

    • 配置settings.py
    STATIC_URL='/static/'
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, 'static'),
    ]
    
    • 使用
    #加载静态文件
    {% load static %}
    
    #链接到静态文件
    <img src="{% static 'elema/img/1.jpeg' %}">
    

    二、中间件

    • 应用场景
    本质: 就是一个python类
    应用场景: 统计、黑名单、白名单、反爬...
    
    • 中间件方法
    - __init__
        不需要传参,服务器响应第一个请求的时,会自动调用,用于确定是否启用中间件 
    - process_request(self,request)
        在视图执行前调用(即分配url匹配视图之前),每个请求都会调用,返回None或HttpResponse对象
    - process_view(self,request,view_func,view_args,view_kwargs)
        调用视图之前执行,每个请求都会调用,返回None或HttpResponse对象
    - process_templae_response(self,request,response)
        在视图刚好执行完后调用,每个请求都会调用,返回None或HttpResponse对象
    - process_response(self,request,response)
        所有响应返回浏览器之前调用,每个请求都会调用,返回None或HttpResponse对象 
    - process_exception(self,request,exception)
        当视图出现异常时调用,返回HttpResponse对象
    

    备注: 为什么会返回HttpRespons对象?因为在请求进来后如果有问题,就可以不做后续处理,直接给客户端响应。

    • 方法执行顺序


      https://img.haomeiwen.com/i1801379/824ff49a45e847bf.png
    • 自定义中间件并使用
    在工程目录下middleware目录下创建应用目录 
    - 在middleware/elema中创建一个elemamiddleware.py 
    from django.utils.deprecation import MiddlewareMixin 
    class MyMiddle(MiddlewareMixin): 
        # 在视图执行前调用 
        def process_request(self,reqeust):
            print('get请求,参数name: ', reqeust.GET.get('name')) 
    - 配置settings.py文件(即在MIDDLEWARE中添加上述文件的位置) 
        'middleware.elema.elemamiddleware.MyMiddle'
    
    • 中间件(黑名单拦截)
    # 拦截器,拦截他黑名单中的IP 
    class MyMiddle(MiddlewareMixin): 
        def process_request(self, request): 
            if request.META['REMOTE_ADDR'] in getattr(settings, 'BLOCKED_IPS', []): 
            return HttpResponse('<h1>Forbidden</h1>') 
    # settings.py中 
    BLOCKED_IPS = [ # IP黑名单 '192.168.0.100' ]
    
    • 中间件(未登陆处理)
    class MyMiddle(MiddlewareMixin): 
        def process_request(self, request): 
            # request.META['REMOTE_ADDR'] 请求的IP地址 
            if request.path !='/meituan/login/': # 检测如果不是登录的话 
                if "username" in request.COOKIES: # 已经登录不做任何处理 
                    pass 
                else: # 未登录,重定向到登录页面 
                return HttpResponseRedirect('/meituan/login/')
    

    三、文件上传

    • 注意
    - 文件上传时,文件数据存储在request.FILES属性中
    - form表单要上传文件需要加 enctype="multipart/form-data"
    - 上传文件必须是post请求
    
    • 存储路径
    - 在static目录下创建upfile目录用于存储接受上传的文件
    - 配置settings.py文件
        MDEIA_ROOT = os.path.join(BASE_DIR,'static/upfile')
    
    • 文件内容
    # 获取表单上传的文件内容
    file = request.FILES['file']
    
    #设置上传文件的保存路径
    filePath = os.path.join(settings.MDEIA_ROOT,file.name)
    
    #文件写入后台
    with open(filepath,'wb') as fp:
    

    四、分页

    • Paginator(列表,每页个数)
    #属性
    - .count:对象总页数
    - .num_pages: 页面总数
    - .page_range: 页码列表(页码从1开始)
    
    • page(num):是Paginator的方法
    #属性
    -   .object_list:当前页面上所有的数据(对象)列表
    -   .number:当前页的页码值
    -   .paginator:当前page对象关联的paginator对象
    
    #方法  
    -   .has_next():判断是否有下一页,如果有返回Ture
    -   .has_previous:判断是否有上一页,如果有返回Ture
    -   .has_other_pages():判断是否有上一页或下一页,如果有返回Ture
    -   .next_page_number(): 返回下一页的页码,如果下一页不存在抛出InvalidPage异常
    -   .previous_page_number(): 返回上一页的页码,如果上一页不存在抛出InvalidPage异常
    -   .len():返回当前页数据的个数
    
    • 实例
    # 所有商品数据
        alllist = Goods.objects.all()
    #切片处理
        alllist = Goods.objects.all()[0:5]
    
    # 12条数据为一页,划分总页数
    # 分页对象
        paginator = Paginator(list(alllist),12)
    
    # 根据传入的页码得到Page对象
        pageobj = paginator.page(page)
    
    # 当前页的所有数据列表(遍历获取)
     pageodj_list = pageobj.object_list
     for goods in pageobj_list
    

    相关文章

      网友评论

          本文标题:Django高级使用

          本文链接:https://www.haomeiwen.com/subject/srconftx.html