2014-11-28 23 views
5

Tôi muốn xác định các tuyến đường thủ công vào một số phương pháp của các tầng lớp, một cái gì đó như thế này:Xác định bằng tay các tuyến đường sử dụng Flask

class X: 

    def route1(): 
     #do stuff here 

    def route2(): 
     #do stuff here 

và sau đó làm một cái gì đó như thế này:

app.add_url_rule('/x/', view_func=X.route1()) 
app.add_url_rule('/y/', view_func=X.route2()) 

Đó là có thể ?? Cách chính xác để hoàn thành điều này là gì?

+0

Trừ thực tế là bạn gọi các chức năng khi đi qua họ cho 'view_func', là bạn thực sự gặp vấn đề làm điều này? – davidism

+0

Nó không rõ ràng nếu bạn đang gặp vấn đề, nhưng tôi sẽ đi với phần mở rộng bình-classy. Về cơ bản là Django Class Based Views cho bình (tốt, họ là một chút nhiều hơn chỉ là vậy, nhưng anyway) – lealhugui

Trả lời

8

Có một số cách để làm điều này:

  1. Tạo một trường toàn cầu của lớp và tuyến đường quy tắc của bạn của bạn với nó:

    class X(object): 
        # Your code here 
    
    INSTANCE_X = X() 
    
    # Note that we are not *calling* the methods 
    app.add_url_rule('/x/', view_func=INSTANCE_X.route1) 
    app.add_url_rule('/y/', view_func=INSTANCE_X.route2) 
    
  2. Tạo một thể hiện trong chức năng xem và đại biểu cho nó:

    # Using both methods of registering URLs here 
    # just to show that both work 
    
    @app.route('/x/') 
    def handle_route1(): 
        return X().route1() 
    
    def handle_route2(): 
        return X().route2() 
    
    app.add_url_rule('/y/', view_func=handle_route2) 
    
  3. Thừa kế từcủa Flask 210 hoặc MethodViewPluggable View lớp và sử dụng as_view classmethod để xử lý việc này cho bạn:

    class X(View): 
        methods = ['GET'] 
    
        def dispatch_request(self): 
         if request.path == '/x/': 
          return route1() 
         elsif request.path == '/y/': 
          return route2() 
         else: 
          abort(404) 
    
    app.add_url_rule('/x/', view_func=X.as_view('X.route1')) 
    app.add_url_rule('/y/', view_func=X.as_view('X.route2')) 
    
+1

nào trong số những phương pháp này là chính xác nhất là sẽ phụ thuộc vào hoàn cảnh của bạn. Tôi thích sử dụng những gì được cung cấp, vì vậy nếu tôi đang làm việc với mã mới, tôi hầu như luôn luôn đi với # 3. –

3

Như tôi đã nói trong các ý kiến, bạn có biết flask-classy?

Từ dụ họ:

from flask import Flask 
from flask.ext.classy import FlaskView 

# we'll make a list to hold some quotes for our app 
quotes = [ 
    "A noble spirit embiggens the smallest man! ~ Jebediah Springfield", 
    "If there is a way to do it better... find it. ~ Thomas Edison", 
    "No one knows what he can do till he tries. ~ Publilius Syrus" 
] 

app = Flask(__name__) 

class QuotesView(FlaskView): 

    def index(self): 
     return "<br>".join(quotes) 

    def get(self, id): 
     id = int(id) 
     if id < len(quotes) - 1: 
      return quotes[id] 
     else: 
      return "Not Found", 404  

QuotesView.register(app) 

if __name__ == '__main__': 
    app.run() 

sẽ tự động tạo các tuyến đường cho http://foobar.foo/quoteshttp://foobar.foo/quotes/<id>

Các vấn đề liên quan