2012-05-10 28 views
8

Bên trong một kế hoạch chi tiết bình, tôi có:Sử dụng Bản thiết kế Flask, cách khắc phục url_for do vi phạm nếu tên miền phụ được chỉ định?

frontend = Blueprint('frontend', __name__) 

và các tuyến đường đến chức năng chỉ số của tôi là:

@frontend.route('/') 
def index(): 
    #code 

này hoạt động tốt, nhưng tôi đang cố gắng để thêm một tên miền phụ để các tuyến đường, như vậy:

@frontend.route('/', subdomain='<var>') 
def index(var): 

Nhưng điều này phá vỡ các ứng dụng và trình duyệt spits ra (trong số những thứ khác):

werkzeug.routing.BuildError 
BuildError: ('frontend.index', {}, None) 

frontend.index được gọi ra trong mã của tôi ở một vài nơi trong một url_for ('frontend.index')

Làm thế nào tôi có thể nhận được url_for để làm việc khi tôi đang trong đó có một tên miền phụ? Điều duy nhất trong các tài liệu tôi có thể tìm thấy và tôi nghĩ rằng có thể có liên quan là này theo http://flask.pocoo.org/docs/api/:

Để tích hợp các ứng dụng, Flask có một cái móc để đánh chặn URL xây dựng lỗi qua Flask.build_error_handler. Các kết quả chức năng url_for trong một BuildError khi ứng dụng hiện tại không có một URL cho các điểm cuối và các giá trị được cho trước là . Khi đó, current_app gọi số build_error_handler của nó nếu nó không phải là None, có thể trả về một chuỗi thành sử dụng làm kết quả của url_for (thay vì url_for‘s mặc định tăng ngoại lệ BuildError) hoặc tăng lại ngoại lệ. Một ví dụ:

def external_url_handler(error, endpoint, **values): 
    "Looks up an external URL when `url_for` cannot build a URL." 
    # This is an example of hooking the build_error_handler. 
    # Here, lookup_url is some utility function you've built 
    # which looks up the endpoint in some external URL registry. 
    url = lookup_url(endpoint, **values) 
    if url is None: 
     # External lookup did not have a URL. 
     # Re-raise the BuildError, in context of original traceback. 
     exc_type, exc_value, tb = sys.exc_info() 
     if exc_value is error: 
      raise exc_type, exc_value, tb 
     else: 
      raise error 
    # url_for will use this result, instead of raising BuildError. 
    return url 

app.build_error_handler = external_url_handler 

Tuy nhiên, tôi mới để trăn (và lập trình) và không thể hiểu được nơi tôi sẽ đặt mã này hay thế nào tôi sẽ nhận được rằng hàm để gọi khi một builderror xảy ra.

Bất kỳ thông tin chi tiết nào sẽ được đánh giá cao :)

+0

Các bạn đã thử thêm '' _external = True'' để url_for của bạn() gọi? –

+0

@chrickso: Xem câu trả lời của tôi. Có vẻ như, bạn chỉ cần cung cấp các tên phương thức khác nhau. – pyfunc

Trả lời

13

Trước tiên, để sử dụng các tên miền phụ bạn cần phải có một giá trị cho SERVER_NAME configuration:

app.config['SERVER_NAME'] = 'example.net' 

Bạn có một cái nhìn như thế này:

frontend = Blueprint('frontend', __name__) 
@frontend.route('/', subdomain='<var>') 
def index(var): 
    return ... 

Để tái tạo lại URL quan điểm này , Bình cần có giá trị cho var. url_for('frontend.index') sẽ thất bại vì nó không có đủ giá trị. Với SERVER_NAME ở trên, url_for('frontend.index', var='foo') sẽ trả lại http://foo.example.net/.

-3

Tôi không nghĩ đây là vấn đề với Flask.

Bạn đang cung cấp hai chức năng với tên cùng một phương pháp:

@frontend.route('/') 
def index(): 
    #code 

@frontend.route('/', subdomain='<var>') 
def index(var): 

Chúng được bọc cách khác nhau nhưng khi flask.build_url được gọi, nó được ném vì tên hàm quá tải . Điều này có vẻ không chính xác trong nháy mắt đầu tiên.

Cố gắng cung cấp một tên hàm khác nhau cho một thứ hai như

@frontend.route('/', subdomain='<var>') 
def index_var(var): 

Điều này có thể giải quyết vấn đề của bạn. Tôi đã không thử nghiệm nó mặc dù.

9

Thêm tên kế hoạch chi tiết trong url_for. Ví dụ:

url_for('pay_sermepa.sermepa_cancel', _external=True) 
  • pay_sermepa: kế hoạch chi tiết tên
  • sermepa_cancel: tuyến đường
Các vấn đề liên quan