2013-06-16 5 views
6

मेरी मुख्य ऐप फ़ाइल वर्तमान में विधि परिभाषाओं की श्रृंखला है, प्रत्येक मार्ग से जुड़ी है। मेरे पास मेरे ऐप (मुख्य, व्यवस्थापक, एपीआई) में 3 विशिष्ट भाग हैं। मैं बेहतर रखरखाव के लिए बाहरी फाइलों में विधियों को विभाजित करने की कोशिश कर रहा हूं लेकिन मुझे अपने एप्लिकेशन के यूआरएल के लिए मार्ग सजावट का उपयोग करने में फ्लास्क की सादगी पसंद है।क्या मैं पाइथन/फ्लास्क में रूट सजावट के रूप में बाहरी तरीकों का उपयोग कर सकता हूं?

मेरी मार्गों में से एक वर्तमान में इस तरह दिखता है:

# index.py 
@application.route('/api/galleries') 
def get_galleries(): 
    galleries = { 
     "galleries": # get gallery objects here 
    } 
    return json.dumps(galleries) 

लेकिन मैं अपने एपीआई के लिए तरीकों वाली फ़ाइल में get_galleries विधि को निकालने के लिए करना चाहते हैं:

import api 
@application.route('/api/galleries') 
api.get_galleries(): 

समस्या यह है कि है जब मैं ऐसा करता हूं तो मुझे एक त्रुटि मिलती है। क्या यह संभव है, और यदि ऐसा है तो मैं इसे कैसे कर सकता हूं?

उत्तर

9

की तरह अन्य टिप्पणी में कहा गया है, तो आप app.route('/')(api.view_home()) फोन या बोतल के app.add_url_rule()http://flask.pocoo.org/docs/api/#flask.Flask.add_url_rule

बोतल के @app.route() कोड का उपयोग कर सकते हैं:

## urls.py 

from application import app, views 

app.add_url_rule('/', 'home', view_func=views.home) 
app.add_url_rule('/user/<username>', 'user', view_func=views.user) 
:

def route(self, rule, **options): 
    def decorator(f): 
     endpoint = options.pop('endpoint', None) 
     self.add_url_rule(rule, endpoint, f, **options) 
     return f 
    return decorator 

आप निम्न कर सकते हैं

और फिर:

## views.py 

from flask import request, render_template, flash, url_for, redirect 

def home(): 
    render_template('home.html') 

def user(username): 
    return render_template('user.html', username=username) 

क्या विधि मैं चीजों को तोड़ने के लिए उपयोग करता हूं। परिभाषित करें सभी अपने को उसकी अपनी फ़ाइल में urls और उसके बाद में import urls अपने __init__.py कि app.run()

चलाता है आपके मामले में:

|-- app/ 
|-- __init__.py (where app/application is created and ran) 
|-- api/ 
| |-- urls.py 
| `-- views.py 

API/urls.py

from application import app 

import api.views 

app.add_url_rule('/call/<call>', 'call', view_func=api.views.call) 

API/views.py

from flask import render_template 

def call(call): 
    # do api call code. 
0

एक सजावट सिर्फ एक विशेष कार्य है।

routed_galleries = application.route('/api/galleries')(api.get_galleries) 

और वास्तव में, सजावट करने वाले के आधार पर आपको परिणाम को बिल्कुल भी रखने की आवश्यकता नहीं हो सकती है।

application.route('/api/galleries')(api.get_galleries) 
0

मुझे नहीं लगता कि आप एक को सजाने के लिए तैयार हैं इस तरह से विधि। लेकिन मुझे लगता है कि सजावटी को सामान्य तरीके से इस्तेमाल करने के बजाय, आप इसे मैन्युअल रूप से सजाने के लिए कॉलबैक बना सकते हैं।

def wrap_api(cls, rt): 
    return application.route(rt)(cls) 

तो फिर तुम इसे इस तरह उपयोग कर सकते हैं:

import api 
galleries = wrap_api(api.get_galleries(), '/api/galleries') 
+0

यह काफी एक ही बात है कि क्या कर रहा है 'कुप्पी .add_url_rule() 'करता है। http://flask.pocoo.org/docs/api/#flask.Flask.add_url_rule – bnlucas

+0

आप सही हैं।निश्चित रूप से इस मामले में एपीआई का उपयोग करने के लिए सबसे अच्छा (मेरी राय में)। – kuujo

1

डेकोरेटर सिर्फ कार्य हैं, तो आप सिर्फ कर सकते हैं:

import api 
api.get_galleries = application.route(api.get_galleries, '/api/galleries') 
संबंधित मुद्दे

 संबंधित मुद्दे