美文网首页
静态文件、中间件、分页

静态文件、中间件、分页

作者: 简单可靠才可信 | 来源:发表于2020-02-25 10:20 被阅读0次

    1.静态文件的使用

    # 设置访问静态文件对应的url地址,url以STATIC_URL开头才认为是访问静态文件的地址
    STATIC_URL = '/static/'
    # 设置静态文件存放的静态目录
    STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
    

    1.1 动态生成静态文件的url地址,代码如下

    先导入静态文件: {% load staticfiles %}
    
    再使用: <img src="{% static 'images/bg.jpg' %}">
    

    2.中间件

    中间件函数是 django 框架给我们预留的函数接口,让我们可以干预请求和应答的过程。

    2.1 获取浏览器端的ip地址

    使用 request 对象的META属性:request.META['REMOTE_ADDR']

    2.2 django中间件的创建

    在app软件下新建一个python文件,一般叫做 middleware.py,在里面创建process_view方法,

    这个方法是django预留的方法,并且需要在 settings.py 下的 MIDDLEWARE元组中进行注册

    from django.utils.deprecation import MiddlewareMixin
    def process_view(request, view_func, *view_args, **view_kwargs):
        """视图函数调用之前会调用"""
        pass
    # 一般在middleware.py文件下新建一个中间件类,类里面再写process_view方法
    # 详见这次提交的middleware.py文件, 这个类必须继承 MiddlewareMixin
    class BlockedIPSMiddleware(MiddlewareMixin):
        pass
    
    # settings.py 文件下的代码如下:
    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',
        'booktest.middleware.BlockedIPSMiddleware',  # 注册中间件类
    ]
    

    2.3 django定义的中间件预留函数

    __init__:  # 服务器相应第一个请求的时候调用
    process_request:  # 是在产生request对象,进行url匹配之前调用
    process_view:  # 是在url匹配之后,调用视图函数之前调用
    process_response:  # 视图函数调用之后,内容返回给浏览器之前调用
    process_exception:  # 视图函数出现异常时会调用这个函数(后注册先调用)
    

    3. 后台管理页面的设置

    3.1 模型页对应的列表页上的设置

    在admin.py文件下注册模型类models.py下的模型类,使用以下代码,其中AreaInfo是模型类,AreaInfoAdmin是模型管理类

    admin.site.register(AreaInfo, AreaInfoAdmin)
    

    修改后台页面显示的标题可以修改模型类(AreaInfo)的__str__方法,代码如下所示

    def __str__(self):   return self.atitle
    

    在模型管理类(AreaInfoAdmin)和模型类(AreaInfo)中的部分代码,可以进行如下的设置

    # admin.py下的模型管理类(AreaInfoAdmin)类下定义如下所示:
    # 指定每页显示2条数据
    list_per_page = 2
    
    # list_display列表添加模型类的属性或者模型类的方法
    list_display = ['id', 'atitle', 'title', 'parent']
    
    # 使后台编辑页下方显示可编辑的下拉列表框
    actions_on_bottom = True
    
    # 使后台编辑页上方的下拉列表框隐藏
    actions_on_top = False
    
    # 控制列表页右侧的过滤器
    list_filter = ['atitle']  # 可以是多个
    
    # 添加控制列表页上方的搜索框
    search_fields = ['atitle']
    
    # models.py文件下的模型类(AreaInfo)下的部分代码如下所示:
    # 如下方法对应的标题可在list_display中注册
    def title(self):
        return self.atitle
    title.admin_order_field = 'atitle'  # 指定方法可以通过 atitle 属性进行排序
    title.short_description = '地区名称'  # 指定title的列标题名字
    
    def parent(self):
        if self.aParent is None:
            return ''
        return self.aParent.atitle
    parent.short_description = '上级地区名称'
    

    3.2 编辑页的部分操作

    # fields 和 fieldsets 只能选择其中一个
    # fields = ['aParent', 'atitle']  # 修改编辑页的 标题 和 AParent 的上下顺序
    fieldsets = (  # fieldsets用于编辑页的分组显示
        ('基本', {'fields': ['atitle']}),
        ('高级', {'fields': ['aParent']}),
    )
    
    # 以下方法可以用于同时修改、添加、删除数据库的上级和下级地区
    # 关联对象,添加一端的嵌入模块
    class AreaStackedInline(admin.StackedInline):
        # 写多类的名字
        model = AreaInfo  # 这里的地区模型类即是一类也是多类
        extra = 2  # 控制编辑页下方可添加行为2行
    
    class AreaTabularInline(admin.TabularInline):
        # 写多类的名字
        model = AreaInfo  # 这里的地区模型类即是一类也是多类
        extra = 2  # 控制编辑页下方可添加行为2行
    
    # 模型管理类(AreaInfoAdmin)的属性定义如下
    # inlines = [AreaStackedInline]  # 嵌入下级地区,以块的形式嵌入
    inlines = [AreaTabularInline]  # 嵌入下级地区,以表格的形式嵌入
    

    3.3 重写admin后台的网页

    本机地址为:D:\SoftwareIntsall\Python\Lib\site-packages\django\contrib\admin\templates\admin

    4. 后台上传文件

    4.1 配置上传文件的保存目录

    # 设置配置上传文件的保存目录
    MEDIA_ROOT = os.path.join(BASE_DIR, 'static/media')
    
    # 做好数据库迁移
    # python manage.py makemigrations
    # python manage.py migrate
    

    4.2 配置浏览器上传文件的操作

    4.2.1 模板文件下的代码必须包含如下表单:
    <form method="post" action="/upload_handle" enctype="multipart/form-data">
        {% csrf_token %}
        <input type="file" name="pic"><br/>
        <input type="submit" value="上传图片">
    </form>
    
    4.2.2 后台处理文件的代码如下:
    def upload_handle(request):
        """上传图片处理"""
        # 1.获取上传文件的处理对象
        pic = request.FILES['pic']
        print(f'{type(pic)}')
        # 小于等于 2.5M 的处理对象类型为InMemoryUploadedFile类型,存储在内存中
        # <class 'django.core.files.uploadedfile.InMemoryUploadedFile'>
        # 大于 2.5M 的处理对象类型为TemporaryUploadedFile类型,存储到一个临时文件中
        # <class 'django.core.files.uploadedfile.TemporaryUploadedFile'>
        # pic.name 获取到上传文件的文件名
        # pic.chunks() 遍历上传文件的内容
        # 2.创建一个文件
        save_path = f'{settings.MEDIA_ROOT}/booktest/{pic.name}'
        with open(save_path, 'wb') as f:
            # 3.获取上传文件的内容,并写到创建的文件中
            for content in pic.chunks():
                f.write(content)
        # 4.在数据库中保存上传记录
        PicTest.objects.create(good_pic=f'booktest/{pic.name}')
        # 5.返回
        return HttpResponse('ok')
    

    5. django分页显示

    # 需要导入 Paginator 类
    from django.core.paginator import Paginator
    
    # Paginator 类的使用如下:
    areas = AreaInfo.objects.filter(aParent__isnull=True)
    # 分页,每页显示2条
    paginator = Paginator(areas, 2)
    # print(f'分页的总页数: {paginator.num_pages}')  # 获取分页的总页数
    # print(f'分页的列表: {paginator.page_range}')  # 获取分页的列表
    # page.has_previous 获取分页是否有上一页
    # page.previous_page_number 获取分页上一页的页码
    # page.has_next 获取分页是否有下一页
    # page.next_page_number 获取分页下一页的页码
    # page.paginator 获取分页的Paginator对象
    

    相关文章

      网友评论

          本文标题:静态文件、中间件、分页

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