Flask สามารถมีพารามิเตอร์ URL เสริมหรือไม่?


258

เป็นไปได้ไหมที่จะประกาศพารามิเตอร์ทางเลือกของ flask

ขณะนี้ฉันกำลังดำเนินการตามวิธีต่อไปนี้:

@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_ สำหรับ?

2
ไม่ใช่ที่ฉันรู้ แม้แต่เอกสาร Flask ยังมีตัวอย่างที่คล้ายกัน (คุณต้องเลื่อนลงเล็กน้อยเพื่อดู)
Audrius Kažukauskas

1
คุณสามารถลองใช้ pip install flask_optional_routes ฉันสร้างจุดเล็ก ๆ สำหรับฟังก์ชั่นที่คุณขอ b / c ฉันต้องการมันเช่นกัน รหัสตั้งอยู่ที่: github.com/sudouser2010/flask_optional_routes
sudouser2010

upvoted! หากคุณมีแท็บหลายแท็บในหน้าแรกของคุณที่แต่ละแท็บทริกเกอร์เช่น / หนึ่ง / สอง / สาม / สี่และคุณต้องการโหลดเนื้อหาที่แตกต่างในหน้าเดียวกันโดยไม่ต้องโหลดหน้าซ้ำคุณควรใช้เส้นทางเดียวหรือหลายเส้นทาง?
PirateApp

@PirateApp ที่ไม่สามารถทำได้ด้วย Flask เพียงอย่างเดียวและเป็นคุณสมบัติส่วนหน้าอย่างหมดจด
qaisjp

183

เกือบเหมือนกับ Audrius ที่ปรุงมาหลายเดือนแล้ว แต่คุณอาจพบว่ามันสามารถอ่านได้ง่ายขึ้นด้วยค่าเริ่มต้นในส่วนหัวของฟังก์ชั่น - วิธีที่คุณคุ้นเคยกับงูหลาม:

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

3
นอกจากนี้ยังใช้งานได้หากusernameไม่คงที่ defaults=ค้างค่าเริ่มต้นในพจนานุกรม
kasperhj

2
ฉันชอบอันนี้ เราควรรักษารหัสให้สะอาดเท่าที่ควร
Light.G

โปรดทราบว่ามีข้อแม้ใหญ่ ๆ อยู่ที่นี่: หากคุณมีข้อโต้แย้งหลายตำแหน่งและไม่จำเป็นทั้งหมด, ขวดจะไม่เข้าใจวิธีการสร้าง URL อย่างถูกต้อง คุณสามารถได้รับเช่น / หน้า? arg = foo ที่ควร / foo / หน้า @Audrius Kažukauskasคำตอบทำงานได้ในกรณีนี้ แต่ไม่ได้
rgargente

73

หากคุณใช้ Flask-Restful เช่นฉันมันอาจเป็นไปได้ด้วยวิธีนี้:

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

ในคลาส Resource ของคุณ:

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
คุณควรเพิ่มข้อมูลจากลิงค์ภายนอกที่นี่เพราะหากลิงค์นั้นไม่ถูกต้องคำตอบของคุณจะเสียหาย
tomab


5

เกือบจะเหมือนกับ skornos แต่มีการประกาศตัวแปรสำหรับคำตอบที่ชัดเจนยิ่งขึ้น มันสามารถทำงานกับส่วนขยาย Flask-RESTful :

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วิธีการอนุญาตให้ URL หลายผ่าน แต่ละคนจะถูกส่งไปยังคุณทรัพยากร


1

ฉันรู้ว่าโพสต์นี้เก่ามาก แต่ฉันทำงานกับแพ็คเกจที่เรียกว่า flask_optional_routes รหัสตั้งอยู่ที่: 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. พิมพ์ app.url_map () ในรากของคุณ. py
  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 ที่นี่และฉันสามารถเพิ่มหลายเส้นทางไปยังจุดปลายเดียวได้
jaapz

-8

ฉันคิดว่าคุณสามารถใช้พิมพ์เขียวและนั่นจะทำให้โค้ดของคุณดูดีขึ้นและเรียบร้อย

ตัวอย่าง:

from flask import Blueprint

bp = Blueprint(__name__, "example")

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

นี่ไม่ได้ตอบคำถาม
meyer9
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.