Conectando vistas de Django
-
22-09-2019 - |
Pergunta
Questão simples. Eu tenho um monte de visualizações de django. Existe uma maneira de dizer a Django que para cada visão, use foo(view)
em vez de? Exemplo:
Em vez de escrever
@foo
@bar
@baz
def view(request):
# do something
o tempo todo, eu gostaria de ter
def view(request):
markers = ['some', 'markers']
E conecte -o ao Django:
for view in all_the_views_in_my_app:
view = do_something_based_on_the_marker(view)
Eu gostaria de fazer isso no horário de inicialização do servidor. Alguma ideia?
Solução
Dependendo do que você deseja fazer (ou alcançar), você pode escrever um Middelware personalizado e implementar o método process_view
(e/ou qualquer outro método que você precisa):
process_view()
é chamado pouco antes de Django chamar a vista. Deve retornar tambémNone
ou umHttpResponse
objeto. Se retornarNone
, Django continuará processando esta solicitação, executando qualquer outroprocess_view()
middleware e, então, a visão apropriada. Se retornar umHttpResponse
Objeto, o Django não se incomodará em chamar qualquer outra solicitação, visualização ou middleware de exceção ou a visualização apropriada; Vai devolver issoHttpResponse
. O middleware de resposta é sempre chamado em todas as respostas.
Outras dicas
Não sei por que você quer fazer isso. Eu também não sei por que você não quer usar decoradores. Mas você pode usar esse hackear feio (e provável propenso a erros) como um começo:
def view(request):
pass
view.markers = ['some', 'markers']
algum outro lugar:
from app import views
[x for x in views.__dict__.values() if hasattr(x,'markers')]