带Django的Javascript?

2024-09-28 20:52:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道之前有人问过这个问题,但我很难在Django web应用程序上设置JS,即使我正在阅读文档。

我在运行Django dev服务器。我的文件结构如下:

mysite/
      __init__.py
      MySiteDB
      manage.py
      settings.py
      urls.py
      myapp/
           __init__.py
           admin.py
           models.py
           test.py
           views.py
           templates/
                index.html

我想把Javascript和CSS放在哪里?我在很多地方都试过,包括myapp/templates/mysite/,但似乎都没用。

从index.html:

<head>
    <title>Degree Planner</title>
    <script type="text/javascript" src="/scripts/JQuery.js"></script>
    <script type="text/javascript" src="/media/scripts/sprintf.js"></script>
    <script type="text/javascript" src="/media/scripts/clientside.js"></script>
</head>

来自url.py:

(r'^admin/', include(admin.site.urls)),
(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': 'media'})
(r'^.*', 'mysite.myapp.views.index'),

我怀疑serve()行是错误的原因,例如:

TypeError at /admin/auth/
'tuple' object is not callable

为了弥补猖獗的连枷,我在settings.py中更改了这些设置:

MEDIA_ROOT = '/media/'
MEDIA_URL = 'http://127.0.0.1:8000/media'

更新:我做了一些更改,但仍不起作用:

设置.py

ROOT_PATH = os.path.normpath(os.path.dirname(__file__))

url.py

(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': os.path.join(settings.ROOT_PATH, 'site_media')}),

index.html

<script type="text/javascript" src="/media/JQuery.js"></script>
<script type="text/javascript" src="/media/sprintf.js"></script>
<script type="text/javascript" src="/media/clientside.js"></script>

文件系统:

mysite/
      site_media/
                JQuery.js
                sprintf.js
                clientside.js
      __init__.py
      settings.py
      manage.py
      -- etc
      myapp/
           -- app files, etc

当我转到像http://127.0.0.1:8000/media/sprintf.js这样的url时,我得到:

Page not found: /media/sprintf.js

Tags: pathtextpysrcsettingsadmintypejs
3条回答

如果要使用开发服务器提供静态文件,则可能需要对url.py中的“document_root”使用绝对路径。MEDIA_根和MEDIA_URL在此不起任何作用。

这是我的设置供你参考。我将所有静态媒体文件放在site_media/

mysite/
    site_media/
        css/
        js/
        images/
    ...

在settings.py中:

ROOT_PATH = os.path.normpath(os.path.dirname(__file__))

在url.py中:

url(r'^media/(?P<path>.*)$', "django.views.static.serve", {'document_root':
                                      os.path.join(settings.ROOT_PATH, 'site_media')})

您可以将静态文件移动到其他位置,只需将“document_root”指向正确的路径即可。请确保为生产部署注释掉此url行。

但是这个/media/全局目录存在吗?你在那里放了一个scripts子目录,里面有你想在那里提供的脚本吗?你想从中服务的/scripts/...url怎么办JQuery.js——它似乎在你的urls.py之外的任何地方都没有服务。如果您(无论出于什么原因)希望从几个不同的URL路径为脚本(或任何其他静态服务的文件)提供服务,那么所有这些URL路径都需要在urls.py中与静态服务匹配——或者,执行常规操作并从/media/...根URL为它们提供服务,并将该媒体根目录映射到实际保存这些文件的目录(通常在它们各自的子目录中)。

Django's docs关于静态服务(仅用于开发,因为它被记录为

Using this method is inefficient and insecure. Do not use this in a production setting. Use this only for development.

所以小心点!-)我觉得很清楚。

实际上,您可以将Javascript文件(以及所有静态内容)放在任何需要的地方。我的意思是,Django并没有对放置它们的位置强加一个标准,毕竟Django不会处理它们,它们将由web服务器提供服务。

这么说吧,最好把它们放在靠近项目文件的地方。我建议将它们保存在Django代码的兄弟文件夹中。与媒体根目录相同。

将静态文件与python文件分离是一个好主意,因为现在您可以将它们放在生产环境中完全独立的文件夹中,并轻松地为静态文件和python代码提供不同的访问权限(比如FTP访问或权限)。

需要记住的是,设置的MEDIA_ROOT是用户的媒体文件(即上传的内容)将被放置的位置,这些不是您的静态项目文件,而是您的Django应用程序上传的任何文件(化身、附件等)。

建议的文件夹结构:

mysite.com/
  media/       - User media, this goes in settings.MEDIA_ROOT
  static/      - This is your static content folder
    css/
    js/
    images/
  templates/
  project/     - This is your Django project folder
    __init__.py
    manage.py
    settings.py
    myapp/
      __init__.py
      ...files..py

请参阅关于在开发环境中使用Django的serve()函数的其他响应建议。只要确保在settings.DEBUG is True条件下将url()添加到urlpatterns中。

至于模板,最好使用context processor将静态文件的路径发送到所有模板。

相关问题 更多 >