在Django app中找不到静态目录

时间:2016-01-09 03:50:34

标签: python django google-app-engine static

对于Django和Google App Engine,我有点新手,而且在我的应用设置中设置项目路径时遇到了问题。具体来说,我正在尝试引用一个用于模板的CSS文件。我的目录结构如下:

app/
    app/
        -'__init__'.py
        -settings.py
        -urls.py
        -views.py
        -wsgi.py
img/
static/
    css/
        -style.css
templates/
    -index.html

我认为我的问题在于基于过去几个小时我一直在做的工作的设置。我开始无法引用模板,但我想出了如何做到这一点,让我解释一下:

在settings.py中,我有以下有关模板的信息:

PROJECT_PATH = os.path.abspath(os.path.dirname(__name__))

TEMPLATE_DIRS = (
    PROJECT_PATH + '/templates',
)

事实证明这很简单。我设置了一个PROJECT_PATH,它保存了项目的路径,并附加了templates目录。但是,我仍然无法为静态文件做同样的事情,这就是我迷失的地方。关于静态文件,我在设置中有以下内容:

PROJECT_PATH = os.path.abspath(os.path.dirname(__name__))

STATIC_ROOT = ''

STATIC_URL = '/static/'

STATICFILES_DIRS = (
    PROJECT_PATH + '/static',
)

理论上,只要我使用的目录名为'/ static /',这些默认值就可以正常工作,但它与模板的工作方式不同。我已经尝试了很多不同的东西来尝试将这些值指向正确的目录,但只有一次我实际上已经成功,我认为这是使用绝对路径的组合,即'Users / username / app / static / css /'在部署项目后没有意义,因为我没有在我的计算机上托管它。此外,我可能已经移动了app子文件夹中的静态目录,这也是不必要的。与模板文件相比,静态文件有何不同?为什么我可以使用PROJECT_PATH并附加'/ static'来获得与模板相同的结果?

我项目中的其他一些有用信息:

app/urls.py:

urlpatterns = patterns(
    '',
    url(r'^$', views.index, name='index'),
) + staticfiles_urlpatterns()

templates/index.html:

<html>

    <head>
        {% load staticfiles %}
        <link rel="stylesheet" type="text/css" href="{% static 'css/style.css' %}" />
    </head>

    <body>
        <!--Some stuff-->
    </body>

</html>

app.yaml:

application: siren-1157
version: 1
runtime: python27
api_version: 1
threadsafe: true

handlers:
- url: /.*
  script: main.app
- url: /static
 static_dir: static

libraries:
- name: django
  version: "latest"

编辑:根据@AlexMartelli的一些反馈,我已经将app_yaml中的application_readable:true添加到了这里:

- url: /static
  static_dir: static
  application_readable: true

我在排除故障时使用的其他一些资源,效果不佳:

Django -- Can't get static CSS files to load https://docs.djangoproject.com/en/1.4/howto/static-files/#configuring-static-files https://github.com/divio/django-shop/blob/master/example/settings.py

我尝试过的其他一些事情:

更改index.html中的参考技术:

{% static 'css/style.css'}

{{ STATIC_URL }}css/style.css

使用各种不同的os模块更改了PROJECT_PATH

将STATIC_ROOT,STATIC_URL和STATICFILES_DIRS更改为各种不同的值,从绝对路径('/ Users / username / app / static /')到使用PROJECT_PATH或派生的相对路径

是否有人能够指出我如何设置目录?我觉得我很接近,但它现在让我疯了。

2 个答案:

答案 0 :(得分:4)

给出app.yaml的以下代码段:

handlers:
- url: /.*
  script: main.app
- url: /static
 static_dir: static

Configuring with app.yaml#Static file handlers所述,访问您应用的网络客户端将获取这些静态文件,但您自己的应用程序代码将能够访问它们。将您的handlers:更改为

handlers:
- url: /.*
  script: main.app
- url: /static
  static_dir: static
  application_readable: true

并且网络客户端和您应用程序自己的代码都可以访问这些静态文件(实质上,这些静态文件的两个副本将被上传,一个存放在您的源代码旁边,以便您的应用程序的代码可以读取它们,其他应用引擎优化的静态文件服务器来自其他地方。

答案 1 :(得分:1)

在对其他StackOverflow帖子进行进一步搜索之后,我找到了一个有以下建议的帖子:

检查您是否可以直接导航到所需的css文件。例如,如果您在localhost上运行,请尝试导航到localhost:8080 / static / css / style.css 你能查看文件吗?

执行此操作后,我 实际上能够查看该文件。然后,巧合的是,通过尝试再次访问索引,我能够看到CSS并获得以下日志奖励:

INFO     2016-01-09 04:11:00,856 module.py:794] default: "GET /static/css/style.css HTTP/1.1" 200 2796

可能发生的是,通过手动访问css文件,浏览器被迫重新加载并利用它来显示索引页。

对于一个可能很糟糕的问题,这是一个可怕的答案,但希望将来有人发现它有用。