首页 > 解决方案 > Pymysql - 数据包序列号错误 - 得到 1 预期 1

问题描述

我正在制作一个与烧瓶 api 通信以执行 sql 查询的移动应用程序。

我有一个非常奇怪的问题,当我启动flask web API并在浏览器中测试它时,一切正常,在这个例子中(这是一个检查用户名是否已经存在的方法)

http://NETWORK_IP_ADDRR/checkusr?username=someuser&token=sometoken

它返回:

{
  "exists": "true"
}

现在如果我启动 Xamarin 移动应用程序,转到注册页面并检查用户是否已经存在,我在文本框中输入用户名“someuser”,它告诉我它不存在,当它明确指出它存在时以上。

现在我返回浏览器而不重新启动 api 并执行相同的原始调用:http://NETWORK_IP_ADDRR/checkusr?username=someuser&token=sometoken

现在它"exists": "false"从浏览器本身返回

有趣的是,一旦我在 android 应用程序仍在运行时重新启动 API 并输入用户名“someuser”

/checkusr在烧瓶中:

@app.route('/checkusr')
def CheckUsr():
    username = request.args.get("username")
    token = request.args.get("token")
    dbnameconv = "default"

    if token == clienttoken:
        try:
            ### this is where the exception happens (it happens only when the API server 
            ### is started before the app is deployed to the android emulator)
            cursor.execute("select username from user where username=%s", (username)) 
            print(cursor.mogrify("select username from user where username=%s", (username)))
            dbname = cursor.fetchone()
            dbnameconv = dbname[0]
        except Exception as e:
            print(e) ### Gives error: Pymysql - Packet sequence number wrong - got 1 expected 1
            ### numbers can vary depending on the situation

        print(f"sent: {username} - from db: {dbnameconv}")
        if username == dbnameconv:
            return jsonify(
                {"exists":"true"}
            )
        else:
            return jsonify(
                {"exists":"false"}
            )   
    else:
        return jsonify(
            {"exists":"fail"}
        )  

这就是我在 C# (Xamarin) 中查询 API 的方式

// this is what happens on textchanged event in the register username screen of the app
bool Exists = await calls.CheckUsrAsync(UsrTB.Text, clienttoken);

// this is the CheckUsrAsync() method that is called asynchronously 
public async Task<bool> CheckUsrAsync(string Username, string Token)
{
    var request = (HttpWebRequest)WebRequest.Create($"{WEBAPIURL}/checkusr?username={Username}&token={Token}");

    var response = (HttpWebResponse)(await request.GetResponseAsync());

    var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();

    CheckForm form = JsonConvert.DeserializeObject<CheckForm>(responseString);
    if (form.Exists == "fail")
    {
        return true;
    }
    bool Exists = Convert.ToBoolean(form.Exists);

    return Exists;
}

我无法理解的是为什么 sql 查询仅在 api 在移动应用程序之后启动但可以通过浏览器查询直到移动应用程序连接到 API 时才有效(在应用程序之前启动的 api)

我没有将 API 托管在与 android 模拟器相同的机器上,flask 服务器在本地网络中以调试模式运行。

标签: c#pythonxamarinflask

解决方案


推荐阅读