फ्लास्क में वैकल्पिक URL पैरामीटर हो सकते हैं?


258

क्या सीधे फ्लास्क URL वैकल्पिक पैरामीटर घोषित करना संभव है?

वर्तमान में मैं निम्नलिखित तरीके से आगे बढ़ रहा हूं:

@user.route('/<userId>')
@user.route('/<userId>/<username>')
def show(userId, username=None):
    pass

मैं सीधे कैसे कह सकता हूं कि usernameवैकल्पिक है?

जवाबों:


341

दूसरा तरीका है लिखना

@user.route('/<user_id>', defaults={'username': None})
@user.route('/<user_id>/<username>')
def show(user_id, username):
    pass

लेकिन मुझे लगता है कि आप एकल मार्ग लिखना चाहते हैं और usernameवैकल्पिक के रूप में चिह्नित करना चाहते हैं ? अगर ऐसा है, तो मुझे नहीं लगता कि यह संभव है।


एंडपॉइंट और url_for का संदर्भ देते समय इस पद्धति का उपयोग करने में कोई समस्या?

2
मेरी जानकारी में नहीं। यहां तक ​​कि फ्लास्क डॉक्स में भी इसी तरह का उदाहरण है (आपको इसे देखने के लिए थोड़ा स्क्रॉल करने की आवश्यकता है)।
ऑड्रियस काज़ुकोकसक

1
आप पिप स्थापित स्थापित करने की कोशिश कर सकते हैं flask_optional_routes। मैंने उस कार्यक्षमता के लिए एक पाइप बनाया है जिसका आप अनुरोध कर रहे हैं b / c मुझे इसकी आवश्यकता थी। कोड यहाँ है: github.com/sudouser2010/flask_optional_routes
sudouser2010

upvoted! यदि आपके होम पेज पर एक से अधिक टैब हैं, तो प्रत्येक एक / दो / तीन / चार की तरह कुछ चलाता है और आप पृष्ठ को फिर से लोड किए बिना एक ही पृष्ठ पर अलग-अलग सामग्री लोड करना चाहते हैं, तो क्या आपको एक रूट या कई मार्गों का उपयोग करना चाहिए?
PirateApp

@PirateApp जिसे केवल फ्लास्क के साथ हासिल नहीं किया जा सकता है और विशुद्ध रूप से एक
दृश्य

183

लगभग कुछ महीने पहले ऑड्रीस के रूप में ही पकाया जाता है, लेकिन आप इसे फ़ंक्शन हेड में चूक के साथ थोड़ा अधिक पठनीय पा सकते हैं - जिस तरह से आप अजगर के साथ उपयोग किए जाते हैं:

@app.route('/<user_id>')
@app.route('/<user_id>/<username>')
def show(user_id, username='Anonymous'):
    return user_id + ':' + username

3
इसके अलावा, यह काम करता है अगर usernameस्थिर नहीं है। defaults=एक शब्दकोश में डिफ़ॉल्ट मूल्य जमा देता है।
कास्परज

2
मैं इसे पसंद करता हूं। हमें कोड को जितना हो सके उतना साफ रखना चाहिए।
लाइट.जी

ध्यान रखें कि यहां एक बड़ा चेतावनी है: यदि आपके पास कई स्थितिगत तर्क हैं और उनमें से सभी वैकल्पिक नहीं हैं, तो फ्लास्क को यह समझ नहीं आएगा कि URL को ठीक से कैसे बनाया जाए। आपको कुछ मिल सकता है जैसे / पृष्ठ? Arg = foo जहाँ यह होना चाहिए / foo / पृष्ठ। @Audrius Kažukauskas जवाब उस मामले में काम करता है, लेकिन यह नहीं करता है
कलगी

73

यदि आप मेरी तरह फ्लास्क-रेस्टफुल का उपयोग कर रहे हैं, तो यह इस तरह भी संभव है:

api.add_resource(UserAPI, '/<userId>', '/<userId>/<username>', endpoint = 'user')

आपके संसाधन वर्ग में ए:

class UserAPI(Resource):

  def get(self, userId, username=None):
    pass


11
@app.route('/', defaults={'path': ''})
@app.route('/< path:path >')
def catch_all(path):
    return 'You want path: %s' % path

http://flask.pocoo.org/snippets/57/


3
आपको यहां बाहरी लिंक से जानकारी जोड़ना चाहिए क्योंकि यदि वह लिंक अब मान्य नहीं होगा, तो आपका उत्तर क्षतिग्रस्त हो जाएगा।
टॉमब


5

लगभग कंकोनों के समान, लेकिन अधिक स्पष्ट उत्तर के लिए चर घोषणाओं के साथ। यह फ्लास्क-रेस्टफुल एक्सटेंशन के साथ काम कर सकता है :

from flask import Flask
from flask_restful import Resource, Api

app = Flask(__name__)
api = Api(app)

class UserAPI(Resource):
    def show(userId, username=None):
    pass

api.add_resource(UserAPI, '/<userId>', '/<userId>/<username>', endpoint='user')

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

add_resourceविधि पास गुणकों यूआरएल अनुमति देता है। हर एक को आपके संसाधन में भेजा जाएगा ।


1

मुझे पता है कि यह पोस्ट वास्तव में पुरानी है, लेकिन मैंने एक पैकेज पर काम किया है जो इसे फ्लास्क_ओप्शनल_रूट्स कहते हैं। कोड यहां स्थित है: https://github.com/sudouser2010/flask_optional_routes

from flask import Flask

from flask_optional_routes import OptionalRoutes


app = Flask(__name__)
optional = OptionalRoutes(app)

@optional.routes('/<user_id>/<user_name>?/')
def foobar(user_id, user_name=None):
    return 'it worked!'

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=5000)

0

आप उदाहरण में दिखाते हुए लिख सकते हैं, लेकिन आपको बिल्ड-एरर प्राप्त होता है।

इसे ठीक करने के लिए:

  1. .py में app.url_map () प्रिंट करें
  2. आप कुछ इस तरह देखते हैं:

<Rule '/<userId>/<username>' (HEAD, POST, OPTIONS, GET) -> user.show_0>

तथा

<Rule '/<userId>' (HEAD, POST, OPTIONS, GET) -> .show_1>

  1. टेम्पलेट की तुलना में आप कर सकते हैं {{ url_for('.show_0', args) }}और{{ url_for('.show_1', args) }}

-6

फ्लास्क 0.10 के बाद से आप एक समापन बिंदु पर कई मार्ग जोड़ सकते हैं। लेकिन आप नकली समापन बिंदु जोड़ सकते हैं

@user.route('/<userId>')
def show(userId):
   return show_with_username(userId)

@user.route('/<userId>/<username>')
def show_with_username(userId,username=None):
   pass

5
क्या? यहाँ फ्लास्क 0.10.1 का उपयोग कर रहा हूँ और मैं ठीक एक समापन बिंदु के लिए कई मार्गों को जोड़ सकते हैं।
जापज़

-8

मुझे लगता है कि आप ब्लूप्रिंट का उपयोग कर सकते हैं और इससे उर कोड बेहतर और बड़े करीने से दिखाई देगा।

उदाहरण:

from flask import Blueprint

bp = Blueprint(__name__, "example")

@bp.route("/example", methods=["POST"])
def example(self):
   print("example")

इस सवाल का जवाब नहीं है।
meyer9
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.