फ्लास्क में HTML फॉर्म से पायथन लिपि में डेटा भेजना


84

मेरी पायथन लिपि में नीचे का कोड है:

def cmd_wui(argv, path_to_tx):
    """Run a web UI."""
    from flask import Flask, flash, jsonify, render_template, request
    import webbrowser
    app = Flask(__name__)


    @app.route('/tx/index/')
    def index():
        """Load start page where you select your project folder
        or load history projects from local DB."""
        from txclib import get_version
        txc_version = get_version()
        prj = project.Project(path_to_tx)

        # Let's create a resource list from our config file
        res_list = []
        prev_proj = ''
        for idx, res in enumerate(prj.get_resource_list()):
                hostname = prj.get_resource_host(res)
        username, password = prj.getset_host_credentials(hostname)
        return render_template('init.html', txc_version=txc_version, username=username)

इसके अलावा, मेरे पास init.html में एक HTML फॉर्म है:

<form>
<input type="text" id="projectFilepath" size="40" placeholder="Spot your project files">
<input type="button" id="spotButton" value="Spot">
</form>

जब उपयोगकर्ता मेरी पायथन लिपि में एक चर पर "स्पॉटबटन" पर क्लिक करता है, तो मैं "प्रोजेक्टफाइलपैथ" से उपयोगकर्ता इनपुट कैसे पास कर सकता हूं?

मैं पायथन और फ्लास्क में नया हूं, इसलिए मुझे कोई भी गलती होने पर माफ करना।


1
आपके projectFilepathइनपुट के लिए एक nameविशेषता सेट होना आवश्यक है - तब आप मूल्य में प्रवेश कर सकते हैं request.args.value_of_name(या request.form.value_of_nameयदि एक POSTअनुरोध कर रहे हैं।
शॉन विएरा

2
मैं सूक्ष्मता को बाहर करना चाहता था जिसे आप टैग idपर विशेषता का उपयोग कर रहे हैं <input>, जबकि नीचे दिए गए उत्तर उपयोग करते हैं namenameक्या आप चाहते हैं, के बाद से कि चाबियाँ में के रूप में के माध्यम से आता है request.form
ट्रेंटन

जवाबों:


154

formटैग कुछ विशेषताएं सेट की जरूरत है:

  1. action: वह URL जिसे फ़ॉर्म डेटा सबमिट करने के लिए भेजा जाता है। इससे उत्पन्न करो url_for। यदि एक ही URL फॉर्म को दिखाता है और डेटा को प्रोसेस करता है तो इसे छोड़ा जा सकता है।
  2. method="post": डेटा को POST विधि के साथ प्रपत्र डेटा के रूप में प्रस्तुत करता है। यदि नहीं दिया गया है, या स्पष्ट रूप से सेट किया गया है get, तो डेटा request.argsइसके बजाय GET विधि के साथ क्वेरी स्ट्रिंग ( ) में सबमिट किया जाता है।
  3. enctype="multipart/form-data": जब फॉर्म में फ़ाइल इनपुट होते हैं, तो उसके पास यह एन्कोडिंग सेट होना चाहिए, अन्यथा फाइलें अपलोड नहीं होंगी और फ्लास्क उन्हें नहीं देखेंगे।

inputटैग एक की जरूरत है nameपैरामीटर।

प्रस्तुत डेटा को संभालने के लिए एक दृश्य जोड़ें, जो request.formइनपुट के समान कुंजी के अंतर्गत है name। किसी भी फ़ाइल इनपुट में हो जाएगा request.files

@app.route('/handle_data', methods=['POST'])
def handle_data():
    projectpath = request.form['projectFilepath']
    # your code
    # return a response

फ़ॉर्म का actionउपयोग करके उस दृश्य के URL पर सेट करें url_for:

<form action="{{ url_for('handle_data') }}" method="post">
    <input type="text" name="projectFilepath">
    <input type="submit">
</form>

7
methodवास्तव में वैकल्पिक है - यह करने के लिए चूक GET। अन्यथा, आप पर हाजिर हैं।
सीन विएरा

4
एक noob होने के नाते (सचमुच पहले दिन फ्लास्क पर काम करते हुए), मुझे पहले यह एहसास नहीं था कि किसी को भी करना होगाfrom flask import Flask, request
CodeFinity

3
मैं एक अपवाद प्राप्त करने से बचने के request.form.get('projectFilepath')बजाय उपयोग करना पसंद करता हूं request.form['projectFilepath']यदि अशक्त मूल्य भेजा जाता है।
इब्राहिम।

2
नोटिस करने के लिए एक और चीज़ url_forउस नाम के साथ फ़ंक्शन के लिए लग रही है, इसलिए यहां आपके विचार का नाम होना चाहिएhandle_data
TrigonaMinima

57

आपको एक फ्लास्क दृश्य चाहिए जो POST डेटा और एक HTML फॉर्म प्राप्त करेगा जो इसे भेजेगा।

from flask import request

@app.route('/addRegion', methods=['POST'])
def addRegion():
    ...
    return (request.form['projectFilePath'])
<form action="{{ url_for('addRegion') }}" method="post">
    Project file path: <input type="text" name="projectFilePath"><br>
    <input type="submit" value="Submit">
</form>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.