2011-08-01 15 views
6

này là rất cụ thể với những gì tôi đang cố gắng để làm như vậy tôi bắt đầu mô tả những gì nó là:sử dụng chuỗi truy vấn trong cấu hình tuyến đường Python Pyramid

  • một ứng dụng Pyramid lô phục vụ như http://localhost:6543/path/to/myplot/plot001.png
  • nếu cốt truyện là không có sẵn một hình ảnh khác (work.png)
  • một phần khác là chế độ xem biến dạng cung cấp biểu mẫu HTML để nhập cấu hình cho ô như: http://localhost:6543/path/to/myplot/plot001.png?action=edit. Lưu ý ở đây chuỗi truy vấn "action = edit".
  • cấu hình bao gồm datafile, mẫu, v.v.
  • biểu mẫu đã lưu (để lưu cấu hình) và nút hiển thị (http: // localhost: 6543/path/to/myplot/plot001.png? Action = render). Hiển thị kết quả thành tệp png sau đó được sử dụng theo cách tĩnh.

tôi đã tìm ra tất cả các mảnh như render sử dụng Matplotlib vv nhưng tôi mới để Pyramid và biến dạng. Tôi cũng có một cái nhìn làm việc phục vụ cốt truyện từ tập tin. Dạng biến dạng cũng hoạt động. Tại thời điểm này không rõ ràng với tôi như thế nào để cấu trúc tốt nhất các ULR để phân biệt phục vụ, chỉnh sửa và render usecases. Tôi đoán trong Pyramid nói chuyện này có nghĩa là làm thế nào để cấu hình các tuyến đường cho serve_view và 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): 
... 

Tôi hướng dẫn sử dụng kim tự tháp Tôi không thể tìm thấy tham chiếu cách đặt thông số trong tuyến đường. Tôi đoán một con trỏ đến một số tài liệu hoặc mẫu sẽ là đủ và tôi có thể tìm ra các chi tiết bản thân mình. Cảm ơn bạn!

+0

Pyramid có một cơ chế mà họ gọi Multidict. Tôi nghĩ rằng đây là cách để truy cập chuỗi truy vấn. Tôi sẽ hợp nhất hai khung nhìn và chỉnh sửa thành một và tạo sự khác biệt bằng cách sử dụng một cái gì đó như sau: nếu 'chỉnh sửa' theo yêu cầu.GET.getall ('action'): # chỉnh sửa cấu hình – mark

+0

Những gì bạn nói trong ở trên bình luận là tốt và nó có lẽ là cách tôi sẽ làm điều đó; bạn có thể luân phiên thêm một biến vị ngữ tùy chỉnh vào câu lệnh add_route, nó sẽ phân biệt hai tuyến trên chuỗi truy vấn cho các mục đích phù hợp. Xem http://docs.pylonsproject.org/projects/pyramid/1.1/narr/urldispatch.html#custom-route-predicates –

Trả lời

11

Có hai cách để làm điều này tùy thuộc vào những gì bạn thích để tách mã của bạn.

  1. Đặt tất cả logic vào chế độ xem của bạn, được phân tách bằng dấu 'if' trên 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. Đăng ký nhiều chế độ xem và ủy quyền giữa chúng bằng cách sử dụng chế độ xem tra cứu của kim tự tháp.

    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.. 
    

Hope this helps. Đây là một ví dụ tuyệt vời về việc đăng ký một mẫu url duy nhất và sử dụng các chế độ xem khác nhau cho các loại yêu cầu khác nhau trên url đó.

+0

request_param = 'action = edit'! Tôi đang thoát khỏi điều này. Kim tự tháp thật tuyệt vời! – mark

1

Tôi không chắc chắn bạn có thể sử dụng contex=Root trong trường hợp đó, nhưng những gì bạn đang yêu cầu có lẽ là 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:

Nếu câu hỏi của bạn có nhiều một câu hỏi chung về định tuyến, bạn nên tạo o ne route cho mỗi hành động để giữ cho mã của các chức năng xem của bạn ngắn hơn và rõ ràng hơn. Ví dụ, nếu bạn muốn chỉnh sửa và đưa ra, các tuyến đường của bạn có thể trông giống như thế này:

__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

Tôi không nghĩ rằng matchdict là cách để đi cho các tham số URL. Các tham số không có thứ tự xác định. Ý tôi là trong trường hợp bạn có nhiều hơn một tham số, bạn có thể trao đổi chúng. Theo như tôi hiểu sự phù hợp, nó có nghĩa là để che phần URL ở phía bên trái của "?". – mark

0

Cách hiệu quả hơn sẽ là chỉ định hành động trong url. Và bạn thậm chí có thể phục vụ các hành động khác nhau trên cùng một tên tuyến hoặc nhiều.

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 

Hoặc với chuỗi truy vấn

`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 
Các vấn đề liên quan