2011-08-01 11 views
6

ten jest bardzo specyficzny, co staram się robić tak zacznę opisując, co to jest:użyciu ciąg kwerendy w konfiguracji trasy Python Pyramid

  • aplikację Pyramid obsługujących Działki jak http://localhost:6543/path/to/myplot/plot001.png
  • jeśli fabuła jest niedostępny inny obraz jest obsługiwany (work.png)
  • kolejną częścią jest widok deformacji, który dostarcza formularz HTML, aby wprowadzić konfigurację dla działki, takiej jak: http://localhost:6543/path/to/myplot/plot001.png?action=edit. Zauważ tutaj ciąg zapytania "action = edit".
  • konfiguracja składa się z pliku danych, szablonów itp.
  • w formularzu są zapisane (aby zapisać konfigurację) i przyciski renderowania (http: // localhost: 6543/path/to/myplot/plot001.png? Action = render). Renderowanie wyników do pliku png, który następnie jest używany w sposób statyczny.

Wymyśliłem wszystkie elementy, jak renderowanie za pomocą Matplotlib itp., Ale jestem nowy w Pyramid i Deform. Mam również widok roboczy, który obsługuje wątek z pliku. Również forma deformacji formy. W tej chwili nie jest dla mnie jasne, jak najlepiej zaprojektować ULR, aby odróżnić serwery obsługi, edycji i renderowania. Wydaje mi się, że w Pyramid talk oznacza to, jak skonfigurować trasy dla serve_view i edit_view.

__init__.py: 
    config.add_route('serve_route', 
     '/{project_name}/testruns/{testrun_name}/plots/{plot_name}.png') 
    config.add_route('edit_route', 
     '/{project_name}/testruns/{testrun_name}/plots/{plot_name}.png') 
# can I use query strings like "?action=edit" here to distinguish the difference? 


views.py: 
@view_config(context=Root, route_name='serve_route') 
def plot_view(context, request): 
... 
@view_config(context=Root, renderer='bunseki:templates/form.pt', route_name='edit_route') 
def edit_view(request): 
... 

I Podręcznik piramidy Nie można znaleźć odniesienia do ustawiania parametrów na trasie. Myślę, że wskazówka na jakąś dokumentację lub próbkę byłaby wystarczająca i sam mógłbym określić szczegóły. Dziękuję Ci!

+0

Piramida posiada mechanizm nazywają Multidict. Myślę, że jest to sposób na uzyskanie dostępu do ciągu zapytania. Scalę dwa widoki i edytuję je w jedno i rozróżniam je przy użyciu czegoś takiego: jeśli "edytuj" w request.GET.getall ("akcja"): # edytuj konfigurację – mark

+0

Co mówisz w powyższy komentarz jest w porządku i prawdopodobnie tak bym to zrobił; można na przemian dodać niestandardowy predykat do instrukcji add_route, która będzie dezambagować dwie trasy ciągu zapytania w celu dopasowania. Zobacz http://docs.pylonsproject.org/projects/pyramid/1.1/narr/urldispatch.html#custom-route-predicates –

Odpowiedz

11

Istnieją dwa sposoby zrób to w zależności od tego, co wolisz, aby oddzielić twój kod.

  1. Umieść wszystkie logikę w widoku oddzielonych „if” sprawozdania na request.GET.get('action').

    config.add_route('plot', '/{project_name}/testruns/{testrun_name}/plots/{plot_name}.png') 
    config.scan() 
    
    @view_config(route_name='plot') 
    def plot_view(request): 
        action = request.GET('action') 
        if action == 'edit': 
         # do something 
         return render_to_response('bunseki:templates/form.pt', {}, request) 
    
        # return the png 
    
  2. zarejestrować wiele poglądów i delegat między nimi za pomocą mechaniki widok odnośników piramidy.

    config.add_route('plot', '/{project_name}/testruns/{testrun_name}/plots/{plot_name}.png') 
    config.scan() 
    
    @view_config(route_name='plot') 
    def plot_image_view(request): 
        # return the plot image 
    
    @view_config(route_name='plot', request_param='action=edit', 
          renderer='bunseki:templates/form.pt') 
    def edit_plot_view(request): 
        # edit the plot 
        return {} 
    
    # etc.. 
    

Nadzieja to pomaga. Jest to doskonały przykład zarejestrowania pojedynczego wzorca URL i używania różnych widoków dla różnych typów żądań dla tego adresu URL.

+0

request_param = 'action = edit' is is! Jestem o tym opowiadany. Piramida jest świetna! – mark

1

Nie jestem pewien, czy w tej sytuacji można użyć contex=Root, ale to, o co prosisz, to prawdopodobnie matchdict.

__init__.py:

config.add_route('serve_route', 
    '/{project_name}/testruns/{testrun_name}/plots/{plot_name}.png') 

views.py:

@view_config(route_name='serve_route') 
def plot_view(request): 
    project_name = request.matchdict['project_name'] 
    action = request.params.get('action', None) 

http://docs.pylonsproject.org/projects/pyramid/1.1/narr/urldispatch.html#matchdict

Edit:

Jeśli pytanie jest bardziej ogólne pytanie dotyczące routingu powinieneś stworzyć o ne trasa na akcję, aby kod kodu widoku był krótszy i wyraźniejszy. Na przykład, jeśli chcesz edytować i renderować, wasze drogi może wyglądać mniej więcej tak:

__init__.py:

config.add_route('render_plot', 
    '/{project_name}/testruns/{testrun_name}/plots/{plot_name}.png') 
config.add_route('edit_plot', 
    '/{project_name}/testruns/{testrun_name}/plots/{plot_name}/edit') 

views.py:

@view_config('render_plot') 
def render(request): 
    pass 

@view_config('edit_plot', renderer='bunseki:templates/form.pt') 
def edit(request): 
    pass 
+1

Nie sądzę, że matchdict to sposób na parametry URL. Parametry nie mają zdefiniowanej kolejności. Chodzi mi o to, że jeśli masz więcej niż jeden parametr, możesz je zamienić. O ile rozumiem matchdict, ma to na celu pokrycie części adresu URL po lewej stronie "?". – mark

0

Bardziej skutecznym sposobem będzie określenie akcji w adresie URL. Możesz nawet wyświetlać różne akcje na tej samej nazwie trasy lub w wielu miejscach.

config.add_route('serve_route', '/{project_name}/testruns/{testrun_name}/plots/{action}/{plot_name}.png') 

views.py 
@view_config(context=Root, route_name='serve_route', action='view') 
def plot_view(request): 
    pass 

Albo z łańcucha zapytania

`config.add_route('serve_route', 
    '/{project_name}/testruns/{testrun_name}/plots/{plot_name}.png') 

views.py 
@view_config(context=Root, route_name='serve_route') 
def plot_view(request): 
    try: 
     action = getattr(self._request.GET, 'action') 
    except AttributeError: 
     raise 
Powiązane problemy