Django中辅助技术总结[静态文件,中间件,上传图片,分页案例]

静态文件的设置

静态文件概述:

在网页使用的css文件,js文件和图片叫做静态文件。

设置流程:

  1. 在项目目录中创建static文件夹
  2. 在创建的文件夹里分别创建js,css,img文件夹
  3. 在setting.py文件中做以下配置
STATICFILES_DIRS = [os.path.join(BASE_DIR, ‘static‘)]  # 设置静态文件的物理地址
  1. 设置静态文件路径
STATIC_URL = ‘/abc/‘  # 和物理目录是对应的关系, 逻辑上的概念

动态获取STATIC_URL的方法

  • 在模板文件中加载路径
{% load staticfiles %}
  • 在图片的地址写入
<img src="{% static ‘img/mm.jpg‘ %}" >
<img src="/abc/img/mm.jpg" ># 以上两种效果相同
  • 最终在浏览器渲染成:
动态获取STATIC_URL的地址<br>
<img src="/abc/img/mm.jpg" >

总结:

  • /abc/img/mm.jpg 隐藏了服务器端实际保存文件的目录
  • 当STATIC_URL = ‘/abc/‘这个路径设置为/abc/时加载图片时会到物理地址STATICFILES_DIRS设置项目录下去查找,查找时的路径从img文件夹开始

中间件

点击查看中间件详解: http://www.crazyant.net/1001.html

获取访问浏览器的ip地址:

request.META[‘REMOTE_ADDR‘]

作用:根据指定的Ip限制浏览器的用户访问服务器

自定义中间件类

  1. 在应用的目录里面创建middleware.py
  2. 在该文件当中创建中间件类-->类里面创建中间件函数
  3. 在setting.py中配置中间件MIDDLEWARE_CLASSES里面添加

函数调用顺序说明:

  • __init__ --服务启动接受第一个url请求调用
  • process_request --产生request对象,url匹配之前调用
  • prosess_view --url匹配之后,视图函数之前调用
  • prosess_response --视图函数调用完成之后调用,内容返回给浏览器之前调用
  • prosess_exception --视图函数内部发生异常的时候调用

注意

  调用顺序:当有多个异常类的时候会全部调用,调用顺序与注册顺序相反

class BlockedIPMiddleWare():
    """创建阻止中间件的类"""
    def process_view(self, request, func_view, *view_args, **view_kwargs):
        """会在url配置之后函数调用之前调用"""
        addr = request.META[‘REMOTE_ADDR‘]
        if addr == ‘127.0.0.1‘:
            return HttpResponse(‘middleware block!!!‘)

阻止ip案例Code

class TestMiddleWare():
    """创建测试的中间件类"""
    def __init__(self):
        print(‘----init----‘)

    def process_request(self, request):
        print(‘----process_request----‘)
        # return HttpResponse(‘--process_request--‘)

    def process_view(self, request, view_func, *view_args, **view_kwargs):
        print(‘----process_view----‘)
        # return HttpResponse(‘--process_view--‘)

    def process_response(self, request, response):
        print(‘----process_response----‘)
        # return HttpResponse(‘--process_response--hello--kay--‘)
        return response

        # 如果在执行中间件的过程当中返回了httpResponse对象都会调用
        # process_response()这个函数
        # 只要返回httpResponsedui对象就会调用

中间件函数Code

class ExceptionTestMiddleWare(object):
    """异常中间件类"""
    def process_exception(self, request, exception):
        print(‘----exception_1----‘)
        print(exception)
    # 参数exception返回的是异常对象

异常中间类Code

上传照片

配置上传图片过程:

  • 在setting.py里面做以下配置:
MEDIA_ROOT=os.path.join(BASE_DIR,"static/media")
  • 在static路径下创建media文件夹
  • 在创建的media文件夹下创建booktest文件夹用于保存booktest应用中视图上传的照片
  • 创建包含图片的模型类
class PicTest(models.Model):
    """创建上传图片的模型类"""
    gpic = models.ImageField(upload_to=‘booktest‘)  # 指定上传图片的路径

 

from django.conf import settings
def upload_action(request):
    """上传图片的函数"""
    # 1.接受上传的文件
    pic = request.FILES.get(‘pic‘)
    # print(pic.chunks)
    # 2.拼接保存的路径
    save_path = "%s/booktest/%s" % (settings.MEDIA_ROOT, pic.name)
    # 3.打开文件
    # save_file = open(save_path, ‘wb‘)
    # save_file.close()
    # 4.快捷方法
    with open(save_path, ‘wb‘) as sava_file:
        # 5.传递过来的内容是分块的,  所以要遍历写
        for file in pic.chunks():
            # 6.写数据
            sava_file.write(file)

    # 保存到数据库
    p = PicTest()
    p.gpic = ‘booktest/%s‘ % pic.name
    p.save()
    return HttpResponse(‘ok‘)

上传图片视图中Code

<form action="/upload_action/" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    <input type="file" name="pic">
    <input type="submit" value="上传">
</form>

上传照片模板中Code

def use_pic(request):
    """使用数据库本地的图片
    1.从数据查找出图片对应的照片的路径
    2.返回给http页面
    3.在http页面当中加载
    """
    pic_path = PicTest.objects.get(id=1)
    print(pic_path.gpic)
    return render(request, ‘booktest/use_pic.html‘, {"pic_path": pic_path.gpic})

使用上传的照片视图中的Code

<img src="/static/media/{{ pic_path }}" >

使用上传的照片模板中的Code

分页

Django提供了数据分页的类,这些类被定义在django/core/paginator.py中。 对象Paginator用于对列进行一页n条数据的分页运算。对象Page用于表示第m页的数据。

paginator对象

  • 方法init(列表,int):返回分页对象,参数为列表数据,每面数据的条数。
  • 属性count:返回对象总数。
  • 属性num_pages:返回页面总数。
  • 属性page_range:返回页码列表,从1开始,例如[1, 2, 3, 4]。
  • 方法page(m):返回Page对象,表示第m页的数据,下标以1开始。

Page对象

  • 调用Paginator对象的page()方法返回Page对象,不需要手动构造。
  • 属性object_list:返回当前页对象的列表。
  • 属性number:返回当前是第几页,从1开始。
  • 属性paginator:当前页对应的Paginator对象。
  • 方法has_next():如果有下一页返回True。
  • 方法has_previous():如果有上一页返回True。
  • 方法len():返回当前页面对象的个数。
  • 迭代页面对象:访问当前页面中的每个对象。

def show_prov(request, index):
    """显示所有的省级地区
    1.创建分页的对象
    2.获取第一页的内容
    3.获取所有的页码内容显示到html页面上
    4.处理点击更新显示的内容
    """
    areas = AreaInfo.objects.filter(aparent__isnull=True)
    # areas分页的内容  每10个分一页 创建分页的对象
    paginator = Paginator(areas, 10)
    # 总共有多少页的页码
    page_list = paginator.page_range
    # 获取第一页的内容
    # 判断如果url为show_prov的时候匹配不到数字则为空所以进行判断一下 如果为空就显示第一页
    if not index:
        index = 1
    page = paginator.page(index)
    # 下一页的数子
    # 给模板传递下一页的页码数
    next_index = int(index) + 1
    # 给模板传递上一页的页码数
    previous_index = int(index) - 1
    return render(request, ‘booktest/page_test.html‘, {‘page‘: page, ‘page_list‘: page_list, "next_index": next_index,
                                                       ‘previous_index‘: previous_index})

分页视图中的Code

<body>
<ul>
    {% for area in page %}
        <li>{{ area.atitle }}</li>
    {% endfor %}
</ul>
{# 如果有下一页则反回True #}
{% if page.has_previous %}
    <a href="/show_prov{{ previous_index }}">上一页</a>
{% endif %}
{% for page_index in page_list %}
    {% comment %}
    page.number 返回当前的页面数
    根据page判断是否还有下一个页面/上一页的选项
    {% endcomment %}
    {% if page_index == page.number %}
        {{ page_index }}
    {% else %}
        <a href="/show_prov{{ page_index }}">{{ page_index }}</a>
    {% endif %}
{% endfor %}
{# 如果有下一页则反回True #}
{% if page.has_next %}
    <a href="/show_prov{{ next_index }}">下一页</a>
{% endif %}
</body>

分页模板中的Code

# 位置参数可有可无
url(r‘^show_prov(\d*)/$‘, views.show_prov)

分页url配置Code

时间: 2024-10-15 16:35:52

Django中辅助技术总结[静态文件,中间件,上传图片,分页案例]的相关文章

Django -&gt; debug模式下的静态文件服务(/media/)

正式发布django项目的时候,如果存在静态文件(一般会统一放在名称为media或static的目录下),则需要建立url到文件系统的映射,例如,使用nginx的时候我们需要进行这样的配置. # Django media location /media { alias /home/lyndon/github/Mathematician/dijkstra/media; } location /static { alias /home/lyndon/github/Mathematician/dijk

django关闭DEBUG后 static静态文件都访问不了

Django框架仅在开发模式下提供静态文件服务.当我开启DEBUG模式时,Django内置的服务器是提供静态文件的服务的,所以css等文件访问都没有问题,但是关闭DEBUG模式后,Django便不提供静态文件服务了.想一想这是符合Django的哲学的:这部分事情标准服务器都很擅长,就让服务器去做吧! OK,解决问题的办法也就出现了,我最开始想到的就是,使用项目正式部署是所使用的配置,由apache提供静态文件服务.不过解决问题的方法远不止一种,在stackoverflow上我发现了更有趣的方法.

《ASP.NET Core 高性能系列》静态文件中间件

原文:<ASP.NET Core 高性能系列>静态文件中间件 一.概述 静态文件(如 HTML.CSS.图片和 JavaScript等文件)是 Web程序直接提供给客户端的直接加载的文件. 较比于程序动态交互的代码而言,其实原理都一样(走Http协议), ASP.NET Core中需要进行一些配置才能提供这些文件. 二.wwwroot 静态文件存储在项目的 Web 程序的 {ContentRoot}/wwwroot目录下,但可通过 UseWebRoot 方法更改路径 . Web 应用程序项目的

Django中载入js和css文件

Django中载入js和css文件 项目的文件夹结构例如以下: mysite |-mysite |-|-static |-|---js和css文件 |-|-|-init.py |-| |-models.py |-| |-views.py |-|-init.py |-|-settings.py |-|-urls.py |-templates |-|-(template html 文件) settings.py中static变量的设置: STATIC_ROOT = os.path.join(os.p

node框架express里面静态文件中间件express.static,根据路径名查找文件

- 是express框架下的一个方法,可以根据请求路径名查找某个文件下文件名字和路径名相同的文件 - 3.X里面有20多个中间件,但是在4.X里面 只保留了express.static - 语法 express.static('/设置一下请求路径/路径名','要被查找文件夹的绝对路径') 请求路径后面跟着的路径名和静态文件的根文件下面的文件名字一致,返回页面 let express =require('express'); let path=require('path') let app=exp

django关闭debug后,静态文件的处理

Django框架仅在开发模式下提供静态文件服务.当我开启DEBUG模式时,Django内置的服务器是提供静态文件的服务的,所以css等文件访问都没有问题,但是关闭DEBUG模式后,Django便不提供静态文件服务了. 1.使用django.views.static.serve()方法.在URLconf中添加: 编辑usrs.py,在最后添加如下代码: from django.conf import settings if settings.DEBUG is False: urlpatterns

Django部署生产环境,静态文件不能访问404,以及图片不能访问403

部署环境的搭建请看此博客https://blog.csdn.net/anifans9350/article/details/80145535 查看nginx.conf 文件, nginx文件(etc/nginx/nginx.conf)配置: 修改http里面的server: server { listen 80; server_name localhost; #charset koi8-r; #access_log /var/log/nginx/host.access.log main; acc

在python3中如何加载静态文件详版步骤

在一个网页中,不仅仅只有一个`html`骨架,还需要`css`样式文件,`js`执行文件以及一些图片等.因此在`DTL`中加载静态文件是一个必须要解决的问题.在`DTL`中,使用`static`标签来加载静态文件.要使用`static`标签,首先需要`{% load static %}`.加载静态文件的步骤如下: 首先确保`django.contrib.staticfiles`已经添加到`settings.INSTALLED_APPS`中. 确保在`settings.py`中设置了`STATIC

django基础知识之管理静态文件css,js,images:

管理静态文件 项目中的CSS.图片.js都是静态文件 配置静态文件 在settings 文件中定义静态内容 STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static'), ] 在项目根目录下创建static目录,再创建当前应用名称的目录 mysite/static/myapp/ 在模板中可以使用硬编码 /static/my_app/myexample.jpg 在模板中可以使用static编码 { % l