Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 3, 2011 14:18:04

nuklea
От:
Зарегистрирован: 2009-12-05
Сообщения: 51
Репутация: +  0  -
Профиль   Отправить e-mail  

Упрощение url и middleware для view

Имеется:

urls.py

urlpatterns = patterns('',
url(r'^order/', include('order.urls')),
)
order/urls.py
urlpatterns = patterns('',
url(r'^new', views.new, name='new'),
url(r'^auth$', views.auth, name='auth'),
url(r'^(\d+)/recipient', views.recipient, name='recipient'),
url(r'^(\d+)/select', views.friend_select, name='select'),
url(r'^(\d+)/photos', views.photos, name='photos'),
url(r'^(\d+)/poster(\d+)', views.poster, name='poster'),
url(r'^(\d+)/posters', views.order, name='posters'),
url(r'^poster(\d+)/remove', views.remove_poster, name='remove_poster'),
url(r'^(\d+)/contacts', views.contacts, name='contacts'),
url(r'^(\d+)/payment', views.payment, name='payment'),
url(r'^(\d+)/delivery', views.delivery, name='delivery'),
)
Тут в каждой вьюхе происходит одно тоже, получается объект Order, проверяется, принадлежит ли он определенному пользователю.

Задача: превратить весь этот кошмар в примерно следующее:

urls.py
urlpatterns = patterns('',
url(r'^order/new', order.views.new),
url(r'^order(?P<order_id>\d+)/', include('order.urls')),
)
order/urls.py
urlpatterns = patterns('',
url(r'^auth$', views.auth, name='auth'),
url(r'^recipient', views.recipient, name='recipient'),
url(r'^select', views.friend_select, name='select'),
url(r'^photos', views.photos, name='photos'),
url(r'^poster(\d+)', views.poster, name='poster'),
url(r'^posters', views.order, name='posters'),
url(r'^poster(\d+)/remove', views.remove_poster, name='remove_poster'),
url(r'^contacts', views.contacts, name='contacts'),
url(r'^payment', views.payment, name='payment'),
url(r'^delivery', views.delivery, name='delivery'),
)
А так же добавить в request инстанс модели Order. Получается эдакий middleware для вьюхи. Но вот проблема, не знаю, с какой стороны к этому всему подступиться.



Отредактировано (Июнь 7, 2011 05:48:19)

Офлайн

#2 Июнь 3, 2011 19:15:44

appetito
От:
Зарегистрирован: 2010-09-28
Сообщения: 147
Репутация: +  2  -
Профиль   Отправить e-mail  

Упрощение url и middleware для view

что значит

nuklea
добавить во все шаблоны, обрабатываемые как orderNumber/someaction инстанс объекта Order
?
что будет делать объект в шаблоне URL?



Отредактировано (Июнь 3, 2011 19:16:17)

Офлайн

#3 Июнь 4, 2011 07:32:16

nuklea
От:
Зарегистрирован: 2009-12-05
Сообщения: 51
Репутация: +  0  -
Профиль   Отправить e-mail  

Упрощение url и middleware для view

appetito
что значит
nuklea
добавить во все шаблоны, обрабатываемые как orderNumber/someaction инстанс объекта Order
?
что будет делать объект в шаблоне URL?
Переформулировал топик. Я имел ввиду, что нужно добавит в request инстанс модели Order.



Офлайн

#4 Июнь 4, 2011 11:20:08

appetito
От:
Зарегистрирован: 2010-09-28
Сообщения: 147
Репутация: +  2  -
Профиль   Отправить e-mail  

Упрощение url и middleware для view

можно сделать декоратор типа

def decorator(fn):
def _wrapper(request, order_id):
request.order = Order.objects.get(pk=order_id)
return fn(request, ordr_id)
return _wrapper
и применять его к нужным функциям вида



Офлайн

#5 Июнь 4, 2011 18:59:17

nuklea
От:
Зарегистрирован: 2009-12-05
Сообщения: 51
Репутация: +  0  -
Профиль   Отправить e-mail  

Упрощение url и middleware для view

Спасибо за возможное решение. Еще мысли есть? :)



Офлайн

#6 Июнь 15, 2011 10:42:52

Doberman26rus
От: Ставрополь
Зарегистрирован: 2009-03-16
Сообщения: 128
Репутация: +  1  -
Профиль   Отправить e-mail  

Упрощение url и middleware для view

ну сделай мидлевару, где будешь парсить урл, а дальше как в декораторе приведенном выше. А для чего тебе это нужно?



подпись

Офлайн

#7 Июнь 15, 2011 12:09:48

nuklea
От:
Зарегистрирован: 2009-12-05
Сообщения: 51
Репутация: +  0  -
Профиль   Отправить e-mail  

Упрощение url и middleware для view

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



Офлайн

#8 Июнь 26, 2011 02:44:21

fth
От:
Зарегистрирован: 2010-07-26
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

Упрощение url и middleware для view

А почему бы вам просто написать функцию принимающую request, order_id и отдающую order, ну и выбрасывающую 403-й эксепшн когда надо?
По одной повторяющейся строчке в каждой вьюхе ничего страшного.

Решение получше и правильнее декоратора и уж тем более мидлвари.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version