Джаваскрипт с Джанго? - PullRequest
2 голосов
/ 01 мая 2010

Я знаю, что об этом уже спрашивали, но мне трудно настроить JS в моем веб-приложении 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>

Filesystem

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

Когда я перехожу на URL, например http://127.0.0.1:8000/media/sprintf.js, я получаю:

Page not found: /media/sprintf.js

Ответы [ 8 ]

4 голосов
/ 01 мая 2010

Но существует ли этот /media/ глобальный каталог?И разместили ли вы там подкаталоги scripts со сценариями, которые вы хотите оттуда обслуживать?А как насчет /scripts/... URL-адреса, с которого вы хотите подать JQuery.js - который, похоже, не обслуживается где-либо, начиная с вашего urls.py.Если вы (по какой-либо причине) хотите обслуживать сценарии (или любой другой статически обслуживаемый файл) из нескольких разных URL-путей, все эти URL-пути должны быть сопоставлены в urls.py со статическим обслуживанием - или же выполнитеобычные вещи и обслужите их все с корневого URL /media/..., и сопоставьте этот корень мультимедиа с каталогом, в котором вы на самом деле храните эти файлы (обычно в их соответствующих подкаталогах).

документы Django о статической подаче (для разработки только , поскольку он задокументирован как

Использование этого метода неэффективно и небезопасно . Неиспользуйте это в производственных условиях. Используйте это только для разработки.

так что будьте осторожны! -) мне кажется довольно ясным.

2 голосов
/ 01 мая 2010

Вы можете использовать абсолютный путь для 'document_root' в urls.py, если вы хотите использовать сервер разработки для обслуживания статических файлов. 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 для производственного развертывания.

1 голос
/ 01 мая 2010

На самом деле, вы можете поместить свои файлы 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() для разработки. Просто убедитесь, что вы добавили url() к вашему urlpatterns при условии settings.DEBUG is True.

Что касается ваших шаблонов, рекомендуется использовать процессор контекста для отправки пути статического файла ко всем вашим шаблонам.

0 голосов
/ 08 декабря 2014

Я просто убираю '^', «r'static /» вместо «r '^ static /». Это работает для меня, удачи.

url(r'static/(?P<path>.*)$', 'django.views.static.serve',
     { 'document_root': the_path }),
0 голосов
/ 02 мая 2010

Ошибка 404 возникает из-за того, что MEDIA_ROOT требует абсолютного пути, а не относительного. Сервер пытается получить доступ к /media в вашей файловой системе, что явно не то, что вам нужно.

Попробуйте вместо этого:

import os
PROJECT_PATH = os.path.realpath(os.path.dirname(__file__))
MEDIA_ROOT = os.path.join(PROJECT_PATH, 'site_media')
MEDIA_URL = '/media/'
0 голосов
/ 01 мая 2010

Это структура, которую я использую в проекте, разделенном на несколько приложений. Рекомендуется адаптировать эту структуру с самого начала - вам не нужна глобальная перестановка, когда вам нужно добавить другое приложение в ваш проект.

/media
  favicon.ico
  robots.txt
  /upload # user uploaded files
  /js  # global js files like jQuery
  /main_app
    /js
    /css
    /img
  /other_app
    /js
    /css
    /img

Тогда я использую превосходные StaticMiddleware из django-annoying для обслуживания файлов. settings.py

import os
import annoying

MEDIA_ROOT = os.path.join(os.path.dirname(__file__), "media")
MIDDLEWARE_CLASSES = (
    'annoying.middlewares.StaticServe',
    #...
)
0 голосов
/ 01 мая 2010

В своей работе по разработке я использую встроенный сервер Django, но я читаю медиа-файлы из того же каталога, в котором они находятся в рабочей среде (/ srv / nginx / sitename / media /). Поэтому я клонирую точную структуру каталогов моего производственного сервера на своем домашнем компьютере, что позволяет без проблем вносить изменения в производство без необходимости что-либо менять.

Я храню два разных файла settings.py. В моем домашнем файле settings.py есть настройки локальной базы данных, другой параметр MEDIA_URL и для параметра DEBUG установлено значение True. Я использую это в своем файле URL-адресов, чтобы включить просмотр сервера для локальных носителей (поскольку я не запускаю nginx на своем домашнем компьютере).

In urls.py:

if settings.DEBUG:
    urlpatterns += patterns('',
        (r'^media/(?P<path>.*)$', 'django.views.static.serve',
            {'document_root': settings.MEDIA_ROOT}),
    )

Из settings.py (обратите внимание, MEDIA_ROOT должен быть абсолютным путем):

# Absolute path to the directory that holds media.
# Example: "/home/media/media.lawrence.com/"
MEDIA_ROOT = '/srv/nginx/<sitename>/media/'

# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash if there is a path component (optional in other cases).
# Examples: "http://media.lawrence.com", "http://example.com/media/"
MEDIA_URL = 'http://127.0.0.1:8000/media/'

TEMPLATE_CONTEXT_PROCESSORS = (
    # I've taken out my other processors for this example
    "django.core.context_processors.media",
)

В шаблоне:

<link rel="stylesheet" href="{{ MEDIA_URL }}css/form.css" />{% endblock %}

Файловые:

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

Да, также: если это прямая копия из вашего файла urls.py, вы забыли запятую после представления подачи, это вызывает ошибку TypeError;)

0 голосов
/ 01 мая 2010

Я обслуживаю JavaScript через статические. Итак, у меня есть что-то в моем urls.py, как

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

Так что URL-адреса JS выглядят как /static/js/blah.js, URL-адреса CSS выглядят как /static/css/blah.css и т. Д. У меня есть Apache для обработки статического каталога при работе в рабочей среде, чтобы избежать каких-либо проблем с механизмом статического обслуживания Django.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...