带Django的Javascript?

带Django的Javascript?,javascript,python,css,django,Javascript,Python,Css,Django,我知道以前有人问过这个问题,但我在Django web应用程序上设置JS时遇到了困难,尽管我正在阅读文档 我正在运行Django开发服务器。我的文件结构如下所示: mysite/ __init__.py MySiteDB manage.py settings.py urls.py myapp/ __init__.py admin.py models.py

我知道以前有人问过这个问题,但我在Django web应用程序上设置JS时遇到了困难,尽管我正在阅读文档

我正在运行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>
(r'^admin/', include(admin.site.urls)),
(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': 'media'})
(r'^.*', 'mysite.myapp.views.index'),
MEDIA_ROOT = '/media/'
MEDIA_URL = 'http://127.0.0.1:8000/media'
ROOT_PATH = os.path.normpath(os.path.dirname(__file__))
(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': os.path.join(settings.ROOT_PATH, 'site_media')}),
<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
import os
import annoying

MEDIA_ROOT = os.path.join(os.path.dirname(__file__), "media")
MIDDLEWARE_CLASSES = (
    'annoying.middlewares.StaticServe',
    #...
)
为了弥补猖獗的鞭打,我在settings.py中更改了这些设置:

<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>
(r'^admin/', include(admin.site.urls)),
(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': 'media'})
(r'^.*', 'mysite.myapp.views.index'),
MEDIA_ROOT = '/media/'
MEDIA_URL = 'http://127.0.0.1:8000/media'
ROOT_PATH = os.path.normpath(os.path.dirname(__file__))
(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': os.path.join(settings.ROOT_PATH, 'site_media')}),
<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
import os
import annoying

MEDIA_ROOT = os.path.join(os.path.dirname(__file__), "media")
MIDDLEWARE_CLASSES = (
    'annoying.middlewares.StaticServe',
    #...
)
更新:我做了一些更改,但仍然不起作用:

设置.py

<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>
(r'^admin/', include(admin.site.urls)),
(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': 'media'})
(r'^.*', 'mysite.myapp.views.index'),
MEDIA_ROOT = '/media/'
MEDIA_URL = 'http://127.0.0.1:8000/media'
ROOT_PATH = os.path.normpath(os.path.dirname(__file__))
(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': os.path.join(settings.ROOT_PATH, 'site_media')}),
<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
import os
import annoying

MEDIA_ROOT = os.path.join(os.path.dirname(__file__), "media")
MIDDLEWARE_CLASSES = (
    'annoying.middlewares.StaticServe',
    #...
)
url.py

<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>
(r'^admin/', include(admin.site.urls)),
(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': 'media'})
(r'^.*', 'mysite.myapp.views.index'),
MEDIA_ROOT = '/media/'
MEDIA_URL = 'http://127.0.0.1:8000/media'
ROOT_PATH = os.path.normpath(os.path.dirname(__file__))
(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': os.path.join(settings.ROOT_PATH, 'site_media')}),
<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
import os
import annoying

MEDIA_ROOT = os.path.join(os.path.dirname(__file__), "media")
MIDDLEWARE_CLASSES = (
    'annoying.middlewares.StaticServe',
    #...
)
当我转到像
http://127.0.0.1:8000/media/sprintf.js
,我得到:

Page not found: /media/sprintf.js

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

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

使用此方法是低效的,并且 不安全。请勿在 生产设置。此设置仅用于 发展


所以当心!-)对我来说似乎很清楚。

我通过静态方式提供javascript。所以我在我的url.py中有一些东西

(r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': os.getenv('STATIC_DIR')})
(r'^static/(?P.*)$,'django.views.static.service',{'document_root':os.getenv('static_DIR'))

所以JS URL看起来像
/static/JS/blah.JS
,CSS URL看起来像
/static/CSS/blah.CSS
,等。我让Apache在生产环境中运行时处理静态目录,以避免Django的静态服务机制出现任何问题。

如果您想使用开发服务器服务静态文件,您可能需要在URL.py中使用“document_root”的绝对路径。媒体根目录和媒体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')})
if settings.DEBUG:
    urlpatterns += patterns('',
        (r'^media/(?P<path>.*)$', 'django.views.static.serve',
            {'document_root': settings.MEDIA_ROOT}),
    )
url(r'^media/(?P.*)$,“django.views.static.service”,{'document\u root':
join(settings.ROOT\u path,'site\u media'))

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

对于我的开发工作,我使用Django的内置服务器,但我从与生产相同的目录中读取媒体文件(/srv/nginx/sitename/media/)。因此,我在家里的计算机上克隆了生产服务器的确切目录结构,这样我就可以无缝地将更改推送到生产中,而无需更改任何内容

不过,我保留了两个不同的settings.py文件。My home settings.py文件将我的本地数据库设置、其他媒体URL设置和调试设置为True。我在我的URL文件中使用它来启用本地媒体的服务器视图(因为我没有在家用计算机上运行nginx)

在URL.py中:

url(r'^media/(?P<path>.*)$', "django.views.static.serve", {'document_root':
                                      os.path.join(settings.ROOT_PATH, 'site_media')})
if settings.DEBUG:
    urlpatterns += patterns('',
        (r'^media/(?P<path>.*)$', 'django.views.static.serve',
            {'document_root': settings.MEDIA_ROOT}),
    )
if settings.DEBUG:
urlpatterns+=模式(“”,
(r'^media/(?P.*)$,'django.views.static.service',
{'document_root':settings.MEDIA_root}),
)
从settings.py(注意,媒体根目录必须是绝对路径):

#保存媒体的目录的绝对路径。
#示例:“/home/media/media.lawrence.com/”
MEDIA_ROOT='/srv/nginx//MEDIA/'
#处理从媒体根目录提供的媒体的URL。请务必使用
#如果存在路径组件,则为尾部斜杠(在其他情况下为可选)。
#示例:“http://media.lawrence.com", "http://example.com/media/"
媒体http://127.0.0.1:8000/media/'
模板\u上下文\u处理器=(
#对于这个例子,我已经拿出了我的其他处理器
“django.core.context_processors.media”,
)
在模板中:

<link rel="stylesheet" href="{{ MEDIA_URL }}css/form.css" />{% endblock %}
{%endblock%}
文件系统:

/srv/nginx/<sitename>
    /media  <-- MEDIA_ROOT/MEDIA_URL points to here
        /css
            base.css
            form.css
        /img
        /js
/srv/nginx/

/实际上,你可以把你的Javascript文件(和所有的静态内容)放在任何你想要的地方。我的意思是,Django没有对放置它们的位置设置标准,毕竟它们不会由Django处理,而是由Web服务器提供服务

尽管如此,把它们放在项目文件附近是个好主意。我建议将它们保存在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的
service()
函数的其他响应建议。只要确保将
url()
添加到
urlpatterns
下的
settings.DEBUG为True
条件下即可


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

这是我在项目中使用的一种结构,分为多个应用程序。这是一个很好的练习