zoukankan      html  css  js  c++  java
  • Django之--模板加载图片

    在使用Django加载图片时遇到了一些问题,在模板html文件中无论使用绝对路径还是当前相对路径都无法找到图片,一直报403和404的错误,后来结合官网和网上的其他资料总算是成功了,这里记下来。

    参考网址:
    Django将图片,JS,CSS等文件称作静态文件,如果你要在模板中引用这些静态文件,你必须设置static_url或者static_root。
    1.修改settings.py文件,添加如下内容:
    # Static files (CSS, JavaScript, Images)
    STATIC_URL = '/static/'
    STATICFILES_DIRS = [
         os.path.join(BASE_DIR, "static")
    ]
    

    STATIC_URL的意思是将静态文件的http可访问路径设为/static/,而STATICFILES_DIRS则是真正存储静态文件的目录,你可以通过STATICFILES_DIRS添加多个静态文件存储目录。

    2.修改模板中对于图片的引用路径:

    {% load static %}
    <img src="{% static "1.png" %}" alt="Leo头像" height=100 width=100 />
    

    Django在查找图片时会默认的使用static()方法(前提是你INSTALLED_APPS里包含django.contrib.staticfiles)到你给定的STATICFILES_DIRS目录下寻找静态文件,这种load写法是官网写法,比较推荐。

    我们还可以在static下建每个app的静态文件存放路径,http访问时只要加上app名就好了,例如<img src="{% static "app_name/1.png" %}" alt="Leo头像" height=100 width=100 />

    3.创建相应的目录,并将图片放置到此路径下:

    mkdir -p /root/Django/mysite/static   --/root/Django/mysite/是我的project根目录(BASE_DIR)
    

    这样就可以实现调用了,示例结果如下:

    而且此时我们还可以通过以下URL直接访问此图片:(这就是STATIC_URL的功能,但要保证此路径下图片真实存在)

    http://192.168.1.193:8000/static/1.png --8000是我的对外端口

    关于STATIC_ROOT:

    以上的static_url参数使用的是基于BASE_DIR的相对路径,但很多时候我们引用的静态文件并不一定能被允许放在BASE_DIR目录下,可能是有一个统一的存放路径存放的,因此django的static()方法也提供了另一种访问方式,即STATIC_ROOT参数(static()的第二个输入参数):

    你需要在settings.py中在STATIC_URL下面添加上此参数,其值是静态文件存放的绝对路径。
    使用此参数时建议执行下python manage.py collectstatic,作用是将你STATIC_URL和STATICFILES_DIRS下的所有app静态文件全部拷贝至STATIC_ROOT目录下,这样就方便其他服务统一引用了。
    STATIC_ROOT和STATIC_URL虽然都可以让你的app访问静态文件,但他们的根本区别在于STATIC_ROOT和STATICFILES_DIRS一样都是存真实文件的,而STATIC_URL只是一个url,告诉你怎么访问这些文件,如果你不设置STATIC_ROOT和STATICFILES_DIRS,那么只有你使用第三方的web服务器时指定静态文件路径,静态文件才能被访问,例如uwsgi。
    此外如果将默认的DEBUG=True参数改为False,那么STAIC_URL下的文件也将不可通过http直接访问了,除非你将路径直接加入urls.py。

    关于MEDIA_URL和MEDIA_ROOT:

    上边解释的STATIC相关参数适用于静态的文件,对于用户上传的可修改的媒体文件例如头像图片等,放在STATIC_URL中就不合适了,MEDIA_URL和MEDIA_ROOT这俩参数就是用于处理媒体文件存储的。

    MEDIA_URL和MEDIA_ROOT的差别基本等同于STATIC_URL和STATIC_ROOT的差别。

    目前发现有一点不一样的:即便设置了MEDIA_URL也不能直接通过http访问到媒体文件,还是需要将路径加入urls.py,这点需要注意。

    更多的关于在正式开发中处理静态文件和媒体文件的信息,参考官方文档:

    https://docs.djangoproject.com/en/2.1/howto/static-files/

    https://docs.djangoproject.com/en/2.1/howto/static-files/deployment/

  • 相关阅读:
    【iHMI43 液晶模块】【USB Mass storage 大容量存储设备 / 虚拟U盘代码包】
    [iBoard 电子学堂][第二卷 C程序设计语言 ]第二篇 数据类型与运算符
    【IAR EW STM8 1401】 破解方法
    [iBoard 电子学堂][第八卷 设计任意波发生器]第三篇 直接数字合成(DDS)原理
    发布《iCore》ARM + FPGA 双核心板
    [iBoard 电子学堂][第〇卷 电子基础 ]第三篇 单片微控制器、微处理器
    [iBoard 电子学堂][第二卷 C程序设计语言 ]第一篇 C语言简介
    【iCore双核心组合是开发板例程】【uCGUI 例程及代码包下载】
    发布《iBoard 电子学堂》基础例程之 8051 例程代码!
    【iBoard 电子学堂教程】【uCGUI 例程及代码包下载】
  • 原文地址:https://www.cnblogs.com/leohahah/p/9081320.html
Copyright © 2011-2022 走看看