คุณจะได้รับสตริงแบบสอบถามใน Flask ได้อย่างไร


408

ไม่ชัดเจนจากเอกสารขวดเกี่ยวกับวิธีรับสตริงแบบสอบถาม ฉันใหม่มองไปที่เอกสารไม่พบ!

ดังนั้น

@app.route('/')
@app.route('/data')
def data():
    query_string=??????
    return render_template("data.html")

11
มันอยู่ในเอกสารภายใต้ QuickStart นี้: flask.pocoo.org/docs/quickstart/#the-request-object
Jarus

แต่จะไม่ใช้คำว่า 'สตริงการสืบค้น' มันเพิ่งเรียกพวกเขาว่าพารามิเตอร์ > ในการเข้าถึงพารามิเตอร์ที่ส่งใน URL (? key = value) คุณสามารถใช้แอตทริบิวต์ args:>> searchword = request.args.get ('key', '')
Ion Freeman

คำตอบ:


779
from flask import request

@app.route('/data')
def data():
    # here we want to get the value of user (i.e. ?user=some-value)
    user = request.args.get('user')

70
ตัวอย่างนี้ส่งคืนค่าของพารามิเตอร์ "user" ที่ส่งผ่านในสตริงเคียวรีไม่ใช่สตริงเคียวรีเอง "สตริงข้อความค้นหา" หมายถึงทุกสิ่งหลังเครื่องหมายคำถามและหน้าเครื่องหมายปอนด์หากมีอยู่
Lyndsy Simon

45
ยังคงเป็นคำตอบที่มีประโยชน์พิจารณาว่าเกี่ยวข้องกับคำถาม ถูกต้องและ +1
Necronet

8
ไม่ - เช่นเดียวกับ dict และ. get คุณจะได้รับ None
JPEG_

5
@LyndsySimon: เห็นดี แต่เนื่องจากคำตอบนี้ตอบคำถามของฉันได้อย่างแม่นยำคำค้นหา Google ของฉันได้กล่าวถึง ('รับพารามิเตอร์การขอขวด') ฉันจึงโหวตให้ได้ ฉันเป็นคนอวดรู้ด้วย แต่ฉันก็คิดว่านี่เป็นเวทย์มนต์ของเว็บ 😉
Michael Scheper

5
ไม่มีข้อโต้แย้งจากฉัน! ความคิดเห็นของฉันเกี่ยวกับคำถามนี้เป็นแหล่งที่มาของคะแนน SO และกรรมโดยรวม :) แฮ็คมีความสุข!
Lyndsy Simon

237

URL แบบเต็มมีให้ใช้งานเป็นrequest.urlและสตริงการสืบค้นมีอยู่ในrequest.query_stringและสตริงการสืบค้นสามารถใช้ได้เป็น

นี่คือตัวอย่าง:

from flask import request

@app.route('/adhoc_test/')
def adhoc_test():

    return request.query_string

ในการเข้าถึงพารามิเตอร์ที่รู้จักแต่ละรายการที่ส่งผ่านไปยังสตริงข้อความค้นหาคุณสามารถใช้ request.args.get('param')ในการเข้าถึงพารามิเตอร์ที่รู้จักกันของแต่ละบุคคลผ่านในสตริงแบบสอบถามคุณสามารถใช้นี่คือวิธีที่ "ถูกต้อง" ที่จะทำเท่าที่ฉันรู้

การทางพิเศษแห่งประเทศไทย: ก่อนที่จะไปต่อคุณควรถามตัวเองว่าทำไมคุณต้องการสตริงแบบสอบถาม ฉันไม่เคยต้องดึงสตริงดิบ - ขวดมีกลไกสำหรับการเข้าถึงในลักษณะที่เป็นนามธรรม คุณควรใช้สิ่งเหล่านั้นหากคุณไม่มีเหตุผลที่น่าสนใจ


11
+1 สำหรับคำตอบที่ถูกต้อง กระแส OAuth เช่น Dropbox จะถาม URL การเปลี่ยนเส้นทางเป็นประจำเพื่อส่งสัญญาณให้ มันเหมาะสมแล้วที่คุณต้องการแยกสตริงข้อความค้นหาด้วยตัวเอง
Richard Løvehjerte

-1 เสมือนสำหรับคำตอบที่ผิด😉 แม้ว่าจะถูกต้องตามตัวอักษร แต่ก็ไม่ได้ให้สิ่งที่ OP กำลังมองหาซึ่งคำตอบที่ยอมรับไม่ได้ DWIM FTW เล่นได้ดีในฐานะแม่เหล็กจุดดังนั้น
เดฟ

15

Werkzeug / Flask แยกวิเคราะห์ทุกอย่างให้คุณแล้ว ไม่จำเป็นต้องทำงานเดียวกันอีกครั้งด้วย urlparse:

from flask import request

@app.route('/')
@app.route('/data')
def data():
    query_string = request.query_string  ## There is it
    return render_template("data.html")

เอกสารฉบับเต็มสำหรับวัตถุคำขอและตอบสนองอยู่ใน Werkzeug: http://werkzeug.pocoo.org/docs/wrappers/


14

เราสามารถทำได้โดยใช้ request.query_string

ตัวอย่าง:

ให้พิจารณา view.py

from my_script import get_url_params

@app.route('/web_url/', methods=('get', 'post'))
def get_url_params_index():
    return Response(get_url_params())

คุณยังทำให้มันเป็นโมดูลเพิ่มเติมโดยใช้ Flask Blueprints - http://flask.pocoo.org/docs/0.10/blueprints/

ให้พิจารณาชื่อกำลังถูกส่งผ่านเป็นส่วนหนึ่งของสตริงการสืบค้น / web_url /? first_name = john

## here is my_script.py

## import required flask packages
from flask import request
def get_url_params():
    ## you might further need to format the URL params through escape.    
    firstName = request.args.get('first_name') 
    return firstName

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


11

ฉันมาที่นี่เพื่อค้นหาสตริงการสืบค้นไม่ใช่วิธีรับค่าจากสตริงการสืบค้น

request.query_string ส่งคืนพารามิเตอร์ URL เป็นสตริงไบต์ดิบ (Ref 1)

ตัวอย่างการใช้งานrequest.query_string:

from flask import Flask, request

app = Flask(__name__)

@app.route('/data', methods=['GET'])
def get_query_string():
    return request.query_string

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

เอาท์พุท:

พารามิเตอร์การสืบค้นในเส้นทาง Flask

อ้างอิง:

  1. เอกสาร API อย่างเป็นทางการใน query_string

1
นี่ควรเป็นคำตอบที่ได้รับการยอมรับเนื่องจากเป็นคำตอบที่ถูกต้องที่ OP ต้องการ
constt

มันยากที่จะต่อสู้กับ +600 สำหรับคำตอบที่ไม่ถูกต้อง
Marvin

4

ลองแบบนี้เพื่อค้นหาข้อความ:

from flask import Flask, request

app = Flask(__name__)

@app.route('/parameters', methods=['GET'])
def query_strings():

    args1 = request.args['args1']
    args2 = request.args['args2']
    args3 = request.args['args3']

    return '''<h1>The Query String are...{}:{}:{}</h1>''' .format(args1,args2,args3)


if __name__ == '__main__':

    app.run(debug=True)

เอาท์พุท: ป้อนคำอธิบายรูปภาพที่นี่


request.args ['args1'] เขียนได้ดีกว่าเป็น request.args.get ('args1')
imbatman

1

ทุกรูปแบบของสตริงการสืบค้นที่ดึงได้จากวัตถุที่ร้องขอขวดที่อธิบายไว้ในการพัฒนาเว็บของ O'Reilly Flask :

จากการพัฒนาเว็บของ O'Reilly Flaskและตามที่ระบุไว้โดย Manan Gouhari ก่อนหน้านี้ก่อนอื่นคุณต้องนำเข้าคำขอ:

from flask import request

requestเป็นวัตถุที่เปิดเผยโดยขวดเป็นตัวแปรบริบทชื่อ (คุณ guessed requestมัน) ตามชื่อแนะนำมันมีข้อมูลทั้งหมดที่ไคลเอ็นต์รวมอยู่ในคำขอ HTTP วัตถุนี้มีคุณสมบัติและวิธีการมากมายที่คุณสามารถดึงและโทรได้ตามลำดับ

คุณมีไม่กี่คน requestแอตทริบิวต์ที่มีสตริงข้อความค้นหาที่ให้เลือก ที่นี่ฉันจะแสดงรายการคุณลักษณะทุกอย่างที่มีอยู่ในสตริงแบบสอบถามตลอดจนคำอธิบายจากหนังสือ O'Reilly ของแอตทริบิวต์นั้น

สิ่งแรกargsคือ "พจนานุกรมที่มีอาร์กิวเมนต์ทั้งหมดที่ส่งผ่านในสตริงการสืบค้นของ URL" ดังนั้นหากคุณต้องการแยกสตริงการสืบค้นในพจนานุกรมคุณจะทำสิ่งนี้:

from flask import request

@app.route('/'):
    queryStringDict = request.args

(ตามที่คนอื่น ๆ ชี้คุณสามารถใช้.get('<arg_name>')เพื่อรับค่าเฉพาะจากพจนานุกรม)

จากนั้นมีformแอตทริบิวต์ซึ่งไม่ได้มีสตริงแบบสอบถาม แต่ซึ่งรวมอยู่ในส่วนหนึ่งของแอตทริบิวต์ที่ว่าคนอื่นไม่รวมถึงสตริงการสืบค้นที่ฉันจะแสดงชั่วขณะ อันดับแรกformคือ "พจนานุกรมที่มีเขตข้อมูลฟอร์มทั้งหมดที่ส่งมาพร้อมกับคำขอ" ผมบอกว่าจะพูดแบบนี้: valuesมีอีกแอตทริบิวต์พจนานุกรมที่มีอยู่ในวัตถุคำขอขวดที่เรียกว่า valuesคือ "พจนานุกรมที่รวมค่าในformและargs" การดึงข้อมูลที่มีลักษณะดังนี้:

from flask import request

@app.route('/'):
    formFieldsAndQueryStringDict = request.values

(อีกครั้งใช้.get('<arg_name>')เพื่อลบรายการเฉพาะออกจากพจนานุกรม)

อีกตัวเลือกหนึ่งquery_stringคือ "ส่วนสตริงการสืบค้นของ URL เป็นค่าไบนารี่ดิบ" ตัวอย่างของที่:

from flask import request

@app.route('/'):
    queryStringRaw = request.query_string

จากนั้นเป็นโบนัสที่เพิ่มเข้ามานั่นคือfull_path"เส้นทางและสตริงข้อความค้นหาบางส่วนของ URL" โดย ejemplo:

from flask import request

@app.route('/'):
    pathWithQueryString = request.full_path

และสุดท้ายurl"URL ทั้งหมดที่ลูกค้าร้องขอ" (ซึ่งรวมถึงสตริงข้อความค้นหา):

from flask import request

@app.route('/'):
    pathWithQueryString = request.url

แฮ็คที่มีความสุข :)


0

request.args.get()ซึ่งสามารถทำได้โดยใช้ ตัวอย่างเช่นถ้าสตริงแบบสอบถามของคุณมีเขตข้อมูลdateก็สามารถเข้าถึงได้โดยใช้

date = request.args.get('date')

อย่าลืมเพิ่ม " request" ลงในรายการนำเข้าจากกระติกน้ำเช่น

from flask import request

ในขณะที่คำตอบของคุณถูกต้องทางเทคนิคแล้วมีคำตอบอื่น ๆ (เก่ากว่าและสมบูรณ์กว่า) แนะนำให้ใช้request.args.get(); คำตอบใหม่สำหรับคำถามเก่าควรมีสิ่งที่ไม่ได้กล่าวถึงมาก่อน
lfurini

0

หากคำขอถ้า GET และเราผ่านพารามิเตอร์แบบสอบถามบางอย่างแล้ว

fro`enter code here`m flask import request
@app.route('/')
@app.route('/data')
def data():
   if request.method == 'GET':
      # Get the parameters by key
      arg1 = request.args.get('arg1')
      arg2 = request.args.get('arg2')
      # Generate the query string
      query_string="?arg1={0}&arg2={1}".format(arg1, arg2)
      return render_template("data.html", query_string=query_string)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.