LINUX.ORG.RU

Требуется консультация Джангистов по общим вопросам

 , ,


1

2

Всерьез столкнулся с Django, и не так сложна сама разработка, как непонятны многие особенности работы и мелочи. Очень надеюсь что коллективный разум ЛОРа даст мне полезные советы. Итак, вопросы:
1. Использую в качестве сервера Nginx + uwsgi - годная ли связка, или сейчас модно подымать джангу как-то по-другому?

2. Путаюсь с «проектом» (который django-admin.py startproject) и «приложением» (которое manage.py startapp appname).
Мне нужно чтобы при входе на http://domain.com/ отображалось мое приложение, которое внутри проекта, и чтобы в этом приложении работать с URL-ами от корня, а не от какого-то префикса. Сейчас все сделано таким вот образом:
nginx.conf:

# django
   upstream django {
     ip_hash;
     server unix:/tmp/uwsgi.sock;
   }
   server {
        server_name domain.com;
        listen 192.168.2.5;
        location / {
            uwsgi_pass  django;
            include     uwsgi_params;
        }
   }
uwsgi_flags:
"-M -L -p 4 --python-path /usr/local/www/myproject/ --chdir /usr/local/www/myproject/ -w django_wsgi"
django_wsgi.py в /usr/local/www/myproject/:
#!/usr/local/bin/python
import os
import sys

sys.path.insert(0, os.path.dirname(__file__))
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
os.environ['PYTHON_EGG_CACHE'] = '/tmp/eggs'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

В /usr/local/www/myproject/ лежит settings.py, в котором указаны параметры базы Mysql, все такое, и в кортеже INSTALLED_APPS добавлено мое приложение. Я так понимаю, что нужно верно написать urls.py, чтобы получить то, что я хочу. Сейчас корневой /usr/local/www/myproject/urls.py имеет вид:

urlpatterns = patterns('',
    (r'^myapp/', include('MyApp.urls')),
)
А /usr/local/www/myproject/MyApp/urls.py соответственно содержит:
urlpatterns = patterns('',
    (r'^$', index),
    (r'^domains/', domains),
    (r'^auth/', auth),
)
Вопрос простой: как сделать, чтобы приложение корректно работало при входе не по ссылке http://domain.com/myapp/, а при входе на http://domain.com ?

3. Опять же вопрос правильности. Встречал в разной документации несколько разных способов передачи данных в шаблон. Первый к примеру такой:
return render_to_response('template.html', { словарь-с-данными })
Второй немного иначе и сложнее выглядит:
    mytemplate = loader.get_template("template.html")
    mycontext = Context({ словарь-с-данными })
    return HttpResponse(mytemplate.render(mycontext))
Какой правильнее? Или дело чисто привычки и желания?

4. View-функция может возвращать допустим не только отрендереную страницу, а и редирект. Сейчас для редиректов использую
return redirect('/url/')
из шорткатов, одобряется ли джангистами такой способ, или есть что-то более специфичное?

Буду благодарен, особенно за ответ на второй вопрос.

★★★★★

1. Да. Еще модно сам uwsgi пусткать supervisord`ом

2. r'^', ну ты понял

3. from django.shortcuts import render

return render('template', {})

4. Ок, но лучше передовать вьев или имя юрл патерна чтобы при смене юрлов не надо было править.

zz ★★★★ ()
Ответ на: комментарий от zz

return render(request, 'template', {})

Реквест надо передовать, потому что оно там RequestContext использует внутри, чтобы доступ к сессии был в шаблоне.

zz ★★★★ ()
Ответ на: комментарий от zz

2. r'^', ну ты понял

как все просто!
сенкс.

но лучше передовать вьев или имя юрл патерна чтобы при смене юрлов не надо было править.

более подробно - как передать имя URL-паттерна - можно плз?

Komintern ★★★★★ ()

3. Первый
4. redirect(reverse(fn, args=...))

power ()

1. Еще есть gunicorn. Использую на одном проекте, жалоб нет.

power ()
Ответ на: комментарий от Komintern

Как минимум, потому что url-путь может поменяться, а имя вьюхи вряд ли.

power ()
Ответ на: комментарий от Komintern

Выше zz то же самое написал и ссылку привел :)

Указываешь параметр name для url-паттерна

urlpatterns = patterns('',
    url(r'^archive/(\d{4})/$', archive, name="full-archive"),
    url(r'^archive-summary/(\d{4})/$', archive, {'summary': True}, "arch-summary"),
)

и можешь потом в коде писать reverse('full-archive', args=[2012]), что будет преобразовано в archive/2012/

power ()
Ответ на: комментарий от power

Да, только redirect сам это делает, в него можно сразу отдать модель с get_absolute_url или вьев или имя патерна.

zz ★★★★ ()
Ответ на: комментарий от power

Даже если имя вьюхи поменяется, джигурду с тейсбеком на весь экран ты получишь раньше, чем с хардкод вариантом :)

zz ★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.