GET Request Flask

时间:2015-06-30 23:34:36

标签: python flask get

我写了一些有用的东西,但我百分之百地确信有一种更有效,更快捷的方式来做我所做的事。

我编写的代码主要使用OpenBayes的库并创建一个网络,其中包含节点,节点之间的关系以及与每个节点关联的概率和分布。现在,我正在使用Flask创建一个GET请求,以便通过简单地发送请求来处理条件概率。

我将发送一些证据(给定值),并设置我想要其概率的节点(观察值)。在数学上它看起来像这样:

  

观察值= O 证据= En,其中n> 1

     

P(O | E1,E2,...,En)

我的最终目标是让客户端/服务器ping托管此代码的服务器(使用正确的参数)并根据证据(可能是1个或更多值)不断给出观察概率的最终值。我到目前为止为GET请求部分编写的代码是:

@app.route('/evidence/evidence=<evidence>&observed=<obv>', methods=['GET'])

def get_evidence(evidence, obv):

    # Take <evidence> and <obv> split them up. For example:
    # 'cloudy1rain0sprinkler1' to 'cloudy1', 'rain0' and 'sprinkler1', all in a nice list.

    analyzeEvidence, observedNode = evidence.upper().strip(), obv.upper().strip()
    string, count, newCount, listOfEvidence =  "", 0, 0, {}
    counter = sum(character.isdigit() for character in analyzeEvidence)

    # This portion is to set up all the evidences.

    for y in xrange(0, counter):
        string, newCount = "", count
        for x in xrange(newCount, len(analyzeEvidence)):
            count += 1
            if analyzeEvidence[x].isalpha() == True:
                string += str(analyzeEvidence[x])
            elif analyzeEvidence[x].isdigit() == True and string in allNodes:
                if int(analyzeEvidence[x]) == 1 or int(analyzeEvidence[x]) == 0:
                    listOfEvidence[string] = int(analyzeEvidence[x])
                    break
                else: abort(400)
                break
            else: abort(400)

    net.SetObs(listOfEvidence) # This would set the evidence like this: {"CLOUDY": 1, "RAIN":0}


    # This portion is to set up one single observed value

    string = ""
    for x in xrange(0, len(observedNode)):
        if observedNode[x].isalpha() == True:
            string += str(observedNode[x])
            if string == "WETGRASS":
                string = "WET GRASS"
        elif observedNode[x].isdigit() == True and string in allNodes:
            if int(observedNode[x]) == 1 or int(observedNode[x]) == 0:
                observedValue = int(observedNode[x])
                observedNode = string
                break
            else: abort(400)
        else: abort(400)

    return str(net.Marginalise(observedNode)[observedValue]) # Output returned is the value like: 0.7452

鉴于我的代码,有没有办法优化它?另外,有没有更好的方法来传递这些参数,而不像我的代码那样需要这么多行?我正在计划设置固定的关键参数,但由于我的证据数量可以根据请求而改变,我认为这是这样做的一种方式。

1 个答案:

答案 0 :(得分:0)

您可以使用以下方法轻松地将证据输入拆分为字符串列表:

mccr2

你应该可以做一些与观察相似的事情。

我建议您使用HTTP POST。这样你就可以发送一个JSON对象,它已经为你完成了变量名和值的分离,你要做的就是检查发送的变量名在import re # 'cloudy1rain0sprinkler1' => ['cloudy1', 'rain0' and 'sprinkler1']. evidence_dict = {} input_evidence = 'cloudy1rain0sprinkler1' # looks for a sequence of alphabets followed by any number of digits evidence_list = re.findall('([a-z]+\d+)', input_evidence.lower()) for evidence in evidence_list: name, val, _ = re.split('(\d+)', evidence) if name in allNodes: evidence_dict[name] = val # evidence_dict = {'cloudy': 1, 'rain': 0, 'sprinkler': 1} 中是否有效。它还将允许您的变量列表在某种程度上随意增长。