zoukankan      html  css  js  c++  java
  • daphne 启动django处理静态文件

    p起步

    线上部署时因设置了 settings.DEBUG = False 会导致静态文件都是 404 的情况。主要原因是应为关闭DEBUG模式后,Django 便不提供静态文件服务了。

    runserver 的启动

    如果运行是通过 runserver 命令的方式,那简单,在启动 runserver 指令后追加 --insecure 选项能参数强制 django 处理静态文件。

    其他方式启动

    但如果是通过 uwsgi 或 daphne 等启动的话,追加选项的方式就不管用了。要解决这个问题,我们要手动去使用静态文件服务,这种处理方式是比较推荐的,因为它同时也支持了 runserver 的方式。

    解决的方式如下,在 urls.py 中添加 url 规则:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    from django.contrib.staticfiles.views import serve
    from django.urls import re_path
     
    def return_static(request, path, insecure=True, **kwargs):
      return serve(request, path, insecure, **kwargs)
     
    urlpatterns = [
      ...
      re_path(r'^static/(?P<path>.*)$', return_static, name='static'), # 添加这行
    ]

    这样就行了。

    为什么这样就能解决了?

    需要去做静态文件的路由匹配,但重点是这里多了个函数 return_static 去代理了 serve ,如果你稍微看下 serve 函数的代码就立马理解了:

    1
    2
    3
    def serve(request, path, insecure=False, **kwargs):
      if not settings.DEBUG and not insecure:
        raise Http404

    默认情况下 insecure=False ,并且在关闭调试模式后都是 404。通过写个 return_static 函数其实与 --insecure 的选项是异曲同工的。

    媒体文件的处理

    媒体文件的处理当然可以将上面 url 规则变动下就能加载了。如果用上面的方法来处理媒体文件可以得 90 分,那么下面的方法可以得 95 分。

    上面的方法会搜索多个目录的,尽管开发人员会将静态文件同一放目录下。但 Django 的 admin 模块的静态文件存放在其他地方的。

    而媒体文件,我们只会限定在一个目录的,所以更好的处理方法是只在一个目录下搜索:

    1
    2
    3
    4
    5
    6
    7
    from django.views.static import serve as static_serve  # 注意这里引入的与上面的不同
    from django.urls import re_path
     
    urlpatterns = [
      ...
      re_path(r'^media/(?P<path>.*)$' , static_serve, { 'document_root' : settings.MEDIA_ROOT}),
    ]

    另外,如果网站的所有静态文件都只会在一个目录下(使用 collectstatic 能将所有静态文件都复制到一个目录),那么也请用这个 static_serve 方式去处理静态文件,我们希望我们的程序是精益求精的良品。

    总结

    另外还有通过第三方程序来处理静态文件,比如 nginx 设置 alias 等。但显然我更希望是程序自身的处理方式。

  • 相关阅读:
    程序员的希波克拉底誓言[精华]
    怎样成为优秀的软件模型设计者
    C#中Delegate浅析与思考
    程序员是一个美好的职业[精华]
    hdu 1421(搬寝室)
    hdu 4022(map一对多)
    hdu 1114(完全背包)
    hdu 1159(最长公共子序列)
    hdu 2844(多重背包)
    hdu 1257(最长递增子序列)
  • 原文地址:https://www.cnblogs.com/hushuning/p/12152539.html
Copyright © 2011-2022 走看看