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?

Foi útil?

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ém None ou um HttpResponse objeto. Se retornar None, Django continuará processando esta solicitação, executando qualquer outro process_view() middleware e, então, a visão apropriada. Se retornar um HttpResponse 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 isso HttpResponse. 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')]
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top