Python Flask parses ajax request parameters sent by jQuery DataTables

Background

The front end uses the jQuery DataTables control to initiate an ajax request to the back end, and the back end uses the Flask framework to parse the problem encountered in request parameters. The request parameters are as shown below:

Backend gets parameters

from flask import Flask, request


print request.query_string

'draw=1 & amp;columns[0][data]=name & amp;columns[0][name]= & amp;columns[0][searchable]=true & amp;columns[0][orderable] =true &columns[0][search][value]= &columns[0][search][regex]=false &columns[1][data]=position &columns[1] [name]= & amp;columns[1][searchable]=true & amp;columns[1][orderable]=true & amp;columns[1][search][value]= & amp;columns[1][ search][regex]=false &columns[2][data]=office &columns[2][name]= &columns[2][searchable]=true &columns[2][ orderable]=true &columns[2][search][value]= &columns[2][search][regex]=false &columns[3][data]=age &columns[ 3][name]= &columns[3][searchable]=true &columns[3][orderable]=true &columns[3][search][value]= &columns[3 ][search][regex]=false &columns[4][data]=start_date &columns[4][name]= &columns[4][searchable]=true &columns[4 ][orderable]=true & amp;columns[4][search][value]= & amp;columns[4][search][regex]=false & amp;columns[5][data]=salary & amp; columns[5][name]= &columns[5][searchable]=true &columns[5][orderable]=true &columns[5][search][value]= &columns [5][search][regex]=false & amp;order[0][column]=0 & amp;order[0][dir]=asc & amp;start=0 & amp;length=20 & amp; search[value]= &search[regex]=false &name=张三&_=1694594130375'

print request.values

CombinedMultiDict([ImmutableMultiDict([('draw', u'1'), ('columns[0][data]', u'name'), ('columns[1][ name]', u''), ('columns[5][searchable]', u'true'), ('columns[5][name]', u'\ '), ('columns[4][search][regex]', u'false'), ('columns[1][orderable]', u'true'), (\ 'columns[4][orderable]', u'true'), ('columns[5][orderable]', u'true'), ('columns[2][orderable] ', u'true'), ('columns[4][name]', u''), ('order[0][dir]', u'asc' ), ('columns[1][search][regex]', u'false'), ('columns[3][name]', u''), ('columns [0][search][value]', u''), ('columns[2][searchable]', u'true'), ('columns[3][search] [regex]', u'false'), ('columns[0][search][regex]', u'false'), ('columns[5][data]' , u'salary'), ('start', u'0'), ('columns[4][searchable]', u'true'), ('columns[ 0][searchable]', u'true'), ('columns[5][search][value]', u''), ('columns[3][searchable]\ ', u'true'), ('columns[2][search][value]', u''), ('columns[2][search][regex]', u 'false'), ('columns[1][data]', u'position'), ('columns[1][searchable]', u'true'), ( 'columns[5][search][regex]', u'false'), ('columns[0][orderable]', u'true'), ('columns[4 ][data]', u'start_date'), ('columns[0][name]', u''), ('columns[2][data]', u\ 'office'), ('columns[3][data]', u'age'), ('search[value]', u''), ('columns[3 ][orderable]', u'true'), ('_', u'1694594130375'), ('columns[4][search][value]', u'\ '), ('name', u'\\张\\三'), ('search[regex]', u'false'), ('columns[1][search ][value]', u''), ('order[0][column]', u'0'), ('columns[2][name]', u\ ''), ('length', u'20'), ('columns[3][search][value]', u'')]), ImmutableMultiDict([]) ])

print request.values.get('columns[0][data]')
u'name'
print request.values.get("draw", default=0, type=int)
1
print request.values.get('columns[1][name]')
u''

It can be seen that although this method can obtain the value of the corresponding parameter, it is very troublesome. If you encounter some complex logical judgments, this method is obviously not suitable.

Solution

pip install querystring-parser library

pip install querystring-parser
import json
from querystring_parser import parser

tmp = parser.parse(request.query_string)
print json.dumps(tmp, ensure_ascii=False, indent=4)


{
    "search": {
        "regex": "false",
        "value": ""
    },
    "name": "Zhang San",
    "draw": "1",
    "start": "0",
    "length": "20",
    "_": "1694594130375",
    "order": {
        "0": {
            "column": "0",
            "dir": "asc"
        }
    },
    "columns": {
        "0": {
            "orderable": "true",
            "search": {
                "regex": "false",
                "value": ""
            },
            "data": "name",
            "name": "",
            "searchable": "true"
        },
        "1": {
            "orderable": "true",
            "search": {
                "regex": "false",
                "value": ""
            },
            "data": "position",
            "name": "",
            "searchable": "true"
        },
        "2": {
            "orderable": "true",
            "search": {
                "regex": "false",
                "value": ""
            },
            "data": "office",
            "name": "",
            "searchable": "true"
        },
        "3": {
            "orderable": "true",
            "search": {
                "regex": "false",
                "value": ""
            },
            "data": "age",
            "name": "",
            "searchable": "true"
        },
        "4": {
            "orderable": "true",
            "search": {
                "regex": "false",
                "value": ""
            },
            "data": "start_date",
            "name": "",
            "searchable": "true"
        },
        "5": {
            "orderable": "true",
            "search": {
                "regex": "false",
                "value": ""
            },
            "data": "salary",
            "name": "",
            "searchable": "true"
        }
    }
}

Also

You can see that all the parameters in the request request have been converted to json format, but the array part has also been converted to json, such as the order and columns fields. The key inside is the array subscript and has not been converted into a json array. If you need to convert it to standard json array format, you need to add the following parameter normalized=True (the default value is false).

tmp = parser.parse(request.query_string, normalized=True)
print json.dumps(tmp, ensure_ascii=False, indent=4)

{
    "draw": "1",
    "name": "Zhang San",
    "search": {
        "regex": "false",
        "value": ""
    },
    "start": "0",
    "length": "20",
    "columns": [
        {
            "orderable": "true",
            "search": {
                "regex": "false",
                "value": ""
            },
            "data": "name",
            "name": "",
            "searchable": "true"
        },
        {
            "orderable": "true",
            "search": {
                "regex": "false",
                "value": ""
            },
            "data": "position",
            "name": "",
            "searchable": "true"
        },
        {
            "orderable": "true",
            "search": {
                "regex": "false",
                "value": ""
            },
            "data": "office",
            "name": "",
            "searchable": "true"
        },
        {
            "orderable": "true",
            "search": {
                "regex": "false",
                "value": ""
            },
            "data": "age",
            "name": "",
            "searchable": "true"
        },
        {
            "orderable": "true",
            "search": {
                "regex": "false",
                "value": ""
            },
            "data": "start_date",
            "name": "",
            "searchable": "true"
        },
        {
            "orderable": "true",
            "search": {
                "regex": "false",
                "value": ""
            },
            "data": "salary",
            "name": "",
            "searchable": "true"
        }
    ],
    "order": [
        {
            "column": "0",
            "dir": "asc"
        }
    ],
    "_": "1694594130375"
}

The knowledge points of the article match the official knowledge files, and you can further learn relevant knowledge. Python entry skill treeWeb application development Flask345452 people are learning the system