Django静态文件支持 - 适用于v1.6.5

Django就是一个坑集,每一个坑都需要大量的人员和时间去填补。静态文件的支持就是一例,本人前后折腾N次了,每次都是半个工作日,今再写备忘录,希望能减少后来者或者一个月后的自己。

1、问题重现(假设项目期望位置为d:\froum)

      1.1 打开控制台,进入D:盘根目录下,运行命令行: django-admin.py startproject mysite;

      1.2 键入命令: ren mysite forum。这样就生成了项目(d:\froum),而项目全局配置在("D:\forum\mysite")目录下;

      1.3 新建目录("d:\forum\static\js"),将测试文件("jquery-1.11.1.min.js")拷贝到该目录下,即确保("d:\forum\static\js\jquery-1.11.1.min.js")文件存在;

      1.4 在控制台窗口进入"d:\forum"目录,运行"manage.py runserver 80",打开浏览器,输入地址"localhost",看到django欢迎页面;

      1.5 在浏览器中输入地址"http://localhost/static/js/jquery-1.11.1.min.js",显示404页面找不到错误。

2、初步处理

      2.1 按照网上资料,打开全局url配置文件("d:\forum\mysite\urls.py"),在"urlpatterns"中加入一行,url(r'^static/(?P<path>.*)$', 'django.views.static.serve'),即:

urlpatterns = patterns('',
    ....

    url(r'^static/(?P<path>.*)$', 'django.views.static.serve'),

    ....
)

     2.2 退出并重启django服务(manage.py runserver 80)。在浏览器中重新键入"localhost/static/js/jquery-1.11.1.min.js",依然显示404错误,里面包含"'js\jquery-1.11.1.min.js' could not be found"错误信息。

  2.3 明明存在这样一个文件,命名url配发没有错误,但就是打不开这个文件,很是让人抓狂.

3、问题跟踪

   3.1 在尝试各种外部方法后依然找不到原因(开始有点想念bottle了),还是跟踪源码吧.

   3.2 根据url映射,打开“C:\Python34\Lib\site-packages\django\views\static.py”源文件,找到"serve"函数。在函数开始处添加"print('hello')",在浏览器中刷新("http://localhost/static/js/jquery-1.11.1.min.js").发现控制台根本没打印"hello"信息。可见当你键入“http://localhost/static/js/jquery-1.11.1.min.js”时,django根本没有配发到此函数中。地球人已经难以理解了。

   3.3 使用UltraEdit执行“在文件中搜索”,搜索目录为“C:\Python34\Lib\site-packages\django\”,文件类型为"*.py",搜索内容为"could not be found",执行搜索。搜索最后定位到“C:\Python34\Lib\site-packages\django\contrib\staticfiles\views.py”文件,可找到“serve”函数。同样在此函数开始出加入"print('hello')",刷新浏览器,依然显示404错误,但可看到控制台输出了"hello"信息。

   3.4 分析"C:\Python34\Lib\site-packages\django\contrib\staticfiles\views.py"的“serve”函数,发现当"absolute_path = finders.find(normalized_path)"为空时焕发404错误异常,而“finders”位于"C:\Python34\Lib\site-packages\django\contrib\staticfiles\finders.py"文件中。

   3.5 打开"C:\Python34\Lib\site-packages\django\contrib\staticfiles\finders.py"文件,定位到全局"find"函数中,分析该函数。发现“for finder in get_finders():”语句,打印每个finder对象,发现包括“FileSystemFinder"和"AppDirectoriesFinder"两种类型;

   3.6 定位到“FileSystemFinder”的"find"函数,根据说明文档,发现其依赖"STATICFILES_DIRS"设置,并且为list或者tuple类型。

   3.7 在"d:\forum\mysite\setting.py"文件末尾添加"STATICFILES_DIRS = (BASE_DIR,)"一句,并在"FileSystemFinder"的finder函数开始处添加“print(self.locations,path)”.刷新浏览器,注意到控制台输出"[('','d:\\forum')] js\jquery-1.11.1.min.js"。可见"find"是在"d:\forum"目录下查找“js\jquery-1.11.1.min.js”文件,当然查不到。

   3.8 修正"STATICFILES_DIRS = (BASE_DIR,)" ==> STATICFILES_DIRS = (os.path.join(BASE_DIR, 'static'),),再刷新浏览器,发现页面显示内容正常,控制台输出“[('','d:\\forum/static')] js\jquery-1.11.1.min.js”,即查找“d:\\forum/static/js\jquery-1.11.1.min.js”文件,该文件当然存在。所以页面显示正常。

   3.9 复位对django文件的修改,即删除刚才加入的打印函数即可。

4、结论

   django就像一个坑集,每个坑都需要很多时间与人员去填补。多写点备忘录,可以减少自己和别人的折腾时间。静态文件的支持需要看完“https://docs.djangoproject.com/en/1.6/howto/static-files/”内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值