用Django开发JavaScript?

2 投票
8 回答
20385 浏览
提问于 2025-04-15 22:13

我知道这个问题之前有人问过,但我在把JavaScript放到我的Django网页应用上时遇到了困难,尽管我在看文档。

我正在运行Django的开发服务器。我的文件结构是这样的:

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>

urls.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'

更新:我做了一些修改,但还是不行:

settings.py

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

urls.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 这样的链接时,我得到了:

Page not found: /media/sprintf.js

8 个回答

1

其实,你可以把你的Javascript文件(还有其他静态内容)放在任何你想要的地方。我的意思是,Django并没有规定这些文件必须放在哪里,毕竟这些文件不会被Django处理,而是由网络服务器来提供服务。

不过,把它们放在离项目文件比较近的地方是个好主意。我建议把它们放在和你的Django代码同级的文件夹里。MEDIA_ROOT也是这样。

把静态文件和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()函数的建议。只要确保在urlpatterns中添加那个url(),并在settings.DEBUG is True的条件下使用。

至于你的模板,使用一个上下文处理器来把静态文件的路径发送到所有模板中是个好主意。

2

如果你想用开发服务器来提供静态文件,建议在urls.py中使用绝对路径来设置'document_root'。这里的MEDIA_ROOT和MEDIA_URL并没有什么作用。

以下是我的设置,供你参考。我把所有的静态媒体文件放在site_media/文件夹下。

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

在settings.py文件中:

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

在urls.py文件中:

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

你可以把静态文件移动到其他地方,只需要把'document_root'指向正确的路径就可以了。记得在正式发布的时候把这个url的设置注释掉。

4

那么,/media/这个全局目录存在吗?你有没有在里面放一个叫scripts的子目录,里面放你想要提供的脚本?还有,你想通过/scripts/...这个网址提供JQuery.js,但在你的urls.py文件中似乎没有提供这个路径。如果你(无论出于什么原因)想从多个不同的网址路径提供脚本(或者其他静态文件),那么所有这些网址路径都需要在urls.py中进行匹配,以便能正确提供这些静态文件。否则,你可以选择正常的方法,从/media/...这个根网址提供它们,并将这个媒体根目录映射到你实际存放这些文件的目录(通常是它们各自的子目录)。

Django的文档中关于静态文件提供的内容(仅限于开发使用,因为它被标记为

使用这种方法是低效不安全的。不要在生产环境中使用。仅限于开发使用。

所以要小心!-) 对我来说,这似乎很清楚。

撰写回答