फ्लास्क का उपयोग करके मैं URL से नामित पैरामीटर कैसे प्राप्त कर सकता हूं?


366

जब उपयोगकर्ता मेरे फ्लास्क ऐप पर चल रहे इस URL का उपयोग करता है, तो मैं चाहता हूं कि प्रश्न के बाद वेब सेवा निर्दिष्ट मापदंडों को संभालने में सक्षम हो।

http://10.1.1.1:5000/login?username=alex&password=pw1

#I just want to be able to manipulate the parameters
@app.route('/login', methods=['GET', 'POST'])
def login():
    username = request.form['username']
    print(username)
    password = request.form['password']
    print(password)

89
सुरक्षा के लिए बस एक छोटा संकेत: GET अनुरोधों में पासवर्ड शामिल न करें। Security.stackexchange.com/questions/147188/…
palsch

6
सुरक्षा के लिए एक और छोटा संकेत: HTTP एंडपॉइंट्स को पासवर्ड न भेजें (केवल कभी HTTPS)
DerMike

जवाबों:


591

request.argsक्वेरी स्ट्रिंग की पार्स सामग्री प्राप्त करने के लिए उपयोग करें :

from flask import request

@app.route(...)
def login():
    username = request.args.get('username')
    password = request.args.get('password')

1
में मापदंडों का उपयोग करने की तुलना कैसे करता है app.route('/username=<username>&password=<password>')? इस तरह आप request.args.get लाइनों को बिल्कुल भी नहीं लिखते हैं।
मल्टीगुडवर्स

@multigoodverse इस सवाल पर पहली टिप्पणी देखें कि आपको GET (URL में) के माध्यम से पासवर्ड क्यों नहीं भेजना चाहिए। आम तौर पर, जीईटी अनुरोध ?में मापदंडों की शुरुआत में होना चाहिए , ताकि आप चाहें app.route('/?username=<username>&password=<password>'), लेकिन फ्लास्क प्रश्न चिह्न के बाद सब कुछ पढ़ेंगे request.argsऔर मार्ग से चर की व्याख्या नहीं करेंगे। यदि आप HTML फॉर्म का उपयोग करके अपने उदाहरण मार्ग पर जाना चाहते हैं, तो आपको इसे काम करने के लिए अतिरिक्त जावास्क्रिप्ट का एक समूह चाहिए होगा। अंत में, मार्ग चर अनिवार्य हैं, request.argsवैकल्पिक हो सकते हैं।
विगत

144

URL पैरामीटर उपलब्ध हैं request.args, जो एक ImmutableMultiDict है जिसमें एक getविधि है, जिसमें डिफ़ॉल्ट मान ( default) और प्रकार ( type) के लिए वैकल्पिक पैरामीटर हैं - जो एक कॉल करने योग्य है जो इनपुट मान को वांछित प्रारूप में परिवर्तित करता है। ( अधिक विवरण के लिए विधि का प्रलेखन देखें।)

from flask import request

@app.route('/my-route')
def my_route():
  page = request.args.get('page', default = 1, type = int)
  filter = request.args.get('filter', default = '*', type = str)

उपरोक्त कोड के उदाहरण:

/my-route?page=34               -> page: 34  filter: '*'
/my-route                       -> page:  1  filter: '*'
/my-route?page=10&filter=test   -> page: 10  filter: 'test'
/my-route?page=10&filter=10     -> page: 10  filter: '10'
/my-route?page=*&filter=*       -> page:  1  filter: '*'

2
@ qqbenq.This एक उत्कृष्ट जवाब है! मुझे नहीं पता कि मुझे इस फीचर या अपने कोड के लिए फ्लास्क से प्यार करना चाहिए या नहीं, लेकिन यह वही है जो मैं अपने URL इनपुट को पार्स करने के लिए देख रहा था।
frakman1

2
filterएक आरक्षित शब्द है, का उपयोग नहीं करना चाहिए;)
इवान कैमिलिटो रामिरेज़ वेरिड्स

88

आप व्यू डेफिनिशन के URL पर कोष्ठक <> का भी उपयोग कर सकते हैं और यह इनपुट आपके व्यू फंक्शन की दलीलों में जाएगा

@app.route('/<name>')
def my_view_func(name):
    return name

1
मुझे लगता है कि यह उत्तर होना चाहिए क्योंकि यह है कि फ्लास्क प्रलेखन क्या है
नाथन गेवेन्स्की

31

यदि आपके पास URL में एक भी तर्क है तो आप इसे निम्नानुसार कर सकते हैं

from flask import request
#url
http://10.1.1.1:5000/login/alex

from flask import request
@app.route('/login/<username>', methods=['GET'])
def login(username):
    print(username)

यदि आपके पास कई पैरामीटर हैं:

#url
http://10.1.1.1:5000/login?username=alex&password=pw1

from flask import request
@app.route('/login', methods=['GET'])
    def login():
        username = request.args.get('username')
        print(username)
        password= request.args.get('password')
        print(password)

POST अनुरोधों के मामले में आप क्या करने की कोशिश कर रहे थे, जहां पैरामीटर फॉर्म पैरामीटर के रूप में पारित किए जाते हैं और URL में दिखाई नहीं देते हैं। यदि आप वास्तव में एक लॉगिन एपीआई विकसित कर रहे हैं, तो यह उचित है कि आप GET के बजाय POST अनुरोध का उपयोग करें और उपयोगकर्ता को डेटा का खुलासा करें।

पोस्ट अनुरोध के मामले में, यह निम्नानुसार काम करेगा:

#url
http://10.1.1.1:5000/login

HTML स्निपेट:

<form action="http://10.1.1.1:5000/login" method="POST">
  Username : <input type="text" name="username"><br>
  Password : <input type="password" name="password"><br>
  <input type="submit" value="submit">
</form>

रूट:

from flask import request
@app.route('/login', methods=['POST'])
    def login():
        username = request.form.get('username')
        print(username)
        password= request.form.get('password')
        print(password)

11

यूआरएल:

http://0.0.0.0:5000/user/name/

कोड:

@app.route('/user/<string:name>/', methods=['GET', 'POST'])
def user_view(name):
    print(name)

(संपादित करें: प्रारूप स्ट्रिंग में हटाए गए स्थान)


-1

यह वास्तव में सरल है। मुझे इस प्रक्रिया को दो सरल चरणों में विभाजित करना है।

  1. Html टेम्पलेट पर आप उपयोगकर्ता नाम और पासवर्ड के लिए नाम टैग घोषित करेंगे

    <form method="POST">
    <input type="text" name="user_name"></input>
    <input type="text" name="password"></input>
    </form>
  2. फिर, अपने कोड को इस रूप में बदलें:

    from flask import request
    
    @app.route('/my-route', methods=['POST']) #you should always parse username and 
    # password in a POST method not GET
    def my_route():
      username = request.form.get("user_name")
      print(username)
      password = request.form.get("password")
      print(password)
    #now manipulate the username and password variables as you wish
    #Tip: define another method instead of methods=['GET','POST'], if you want to  
    # render the same template with a GET request too

-2

request.args.get(param)उदाहरण के लिए, उपयोग करें :

http://10.1.1.1:5000/login?username=alex&password=pw1
@app.route('/login', methods=['GET', 'POST'])
def login():
    username = request.args.get('username')
    print(username)
    password = request.args.get('password')
    print(password)

यहाँ कोड के लिए संदर्भित लिंक है।


उपयोगकर्ता नाम और पासवर्ड को कभी भी उजागर न करें! टीएस पर पाल्श और डर्माईक की टिप्पणियों को देखें।
बास वैन ओमेन्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.