Форум сайта python.su
Пишу вьюху, которая представляет собой один класс, в нем несколько методов.
Некоторые методы принимают поступивший request и что-то там с ним делают (конкретно - парсят и обрабатывают пришедщий в нем json). То есть общий вид примерно такой:
class MyView(): def __init__(self): ... def first_function(self, request): try: data = json.loads(self.request.body) ... return HttpResponse('Hello world!!!')
class MyView(): def __init__(self): ... @classmethod def first_function(cls, **initkwargs): self = cls(**initkwargs) try: data = json.loads(self.request.body) ... return HttpResponse('Hello world!!!')
urlpatterns = (url(r'^info/$', MyView.first_function()),)
MyClass instance has no attribute ‘request’' is not a callable or a dot-notation pathКак сделать так, чтобы оно работало? В смысле - может, ему явно request передать (как?) Или как ему инстанс передать, вызывая метод из urls.py?
Отредактировано Elaphe (Дек. 9, 2016 13:45:19)
Офлайн
#views.py (the app named `two`) from django.http import HttpResponse # Create your views here. class CoolClass: @staticmethod def my_view(request): return HttpResponse('I was envoked inside CoolClass!')
#urls.py (main project) from two.views import CoolClass urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^$', CoolClass.my_view) ]
Офлайн
А как тогда ссылаться на другие методы внутри CoolClass? Не оборачивать же все в staticmethod
Офлайн
Elaphe
Все это несколько не так работает
у класса представления есть статический метод as_view, который возвращает функцию, в которой создается объект этого класса и возвращается респонз. Вот эта функция и есть представление.
Если коротко
class View(object): @classmethod def as_view(cls): obj = cls() def view(request): response = obj.dispatch() return response return view def dispatch(): return Response()
Отредактировано FishHook (Дек. 9, 2016 14:55:51)
Офлайн
Разве это не касается только CBV?
Кроме того, как быть, если класс должен обеспечивать несколько представлений?
Или проще не сношать себе мозг и оставить все в виде функций?
Отредактировано Elaphe (Дек. 9, 2016 15:17:46)
Офлайн
ElapheCBV - это представления основанные на классах. Какая разница, какой это класс: из состава джанги или ваш собственный. В любом случае в урл-паттерне должна быть функция (это API джанги), и даже в случае представленя-класса это должна быть функция. И где её взять? Только сделав один из методов класса статическим (точнее методом класса). Чем вам не нравится встроенная реализация? Возьмите базовый класс View и наворачивайте его как вам угодно. По-другому всё равно вряд ли получится. Можно, конечно, попробовать сделать синглтоны, но это приведет к возможности хранить состояние объекта между сессиями, то есть в продакшене при нескольких запущенных процессах вы получите непредсказуемое поведение.
Разве это не касается только CBV
Офлайн
ElapheВас никто не принуждает вызывать именно as_view(). Наделайте as_view1(), as_view2() и т.д. Но зачем?
Кроме того, как быть, если класс должен обеспечивать несколько представлений?
ElapheДа какие к черту функции? На функциях далеко не уедешь. Используйте возможности CBV и не сношайте себе мозг.
Или проще не сношать себе мозг и оставить все в виде функций?
Офлайн
Все, кажется, дошло, буду пробовать. Спасибо.
CBV несколько неудобны для моих целей.
Офлайн
ElapheЭто что ж у вас за цели такие?
CBV несколько неудобны для моих целей.
Офлайн
Бот для telegram. От сервера принимается POST с JSON в теле, на сервер уходит GET с параметрами.
Ради этого импортировать CBV особого смысла не вижу.
Офлайн