0

我正在为我的 Flask Web 应用程序使用geopy库。我想将从我的模态(html 表单)中获取的用户位置保存在我的数据库中(我正在使用 mongodb),但每次我都收到此错误: TypeError:'Location' 类型的对象不是 JSON 可序列化的

这是代码:

@app.route('/register', methods=['GET', 'POST'])
def register_user():
    if request.method == 'POST':
        login_user = mongo.db.mylogin
        existing_user = login_user.find_one({'email': request.form['email']})
        # final_location = geolocator.geocode(session['address'].encode('utf-8'))
        if existing_user is None:
            hashpass = bcrypt.hashpw(
                request.form['pass'].encode('utf-8'), bcrypt.gensalt())
            login_user.insert({'name': request.form['username'], 'email': request.form['email'], 'password': hashpass, 'address': request.form['add'], 'location' : session['location'] })
            session['password'] = request.form['pass']
            session['username'] = request.form['username']
            session['address'] = request.form['add']
            session['location'] = geolocator.geocode(session['address'])
            flash(f"You are Registerd as {session['username']}")
            return redirect(url_for('home'))
        flash('Username is taken !')
        return redirect(url_for('home'))
    return render_template('index.html')

请帮助,如果您想了解更多信息,请告诉我..

4

2 回答 2

0

根据地理定位器文档地理编码功能“按地址返回位置点” geopy.location.Location对象。

Json 序列化默认支持以下类型:

蟒蛇 | JSON

字典 | 目的

列表,元组 | 大批

str, unicode | 细绳

整数、长整数、浮点数 | 数字

真 | 真的

假 | 错误的

无 | 无效的

默认情况下,所有其他对象/类型都不是 json 序列化的,您需要在那里定义它。

geopy.location.Location.raw

位置的原始、未解析的地理编码器响应。有关这方面的详细信息,请参阅服务文档。

返回类型:dict 或 None

您也许可以调用 Location 的原始函数(geolocator.geocode 返回值),并且该值将是 json 可序列化的。

于 2019-12-22T21:22:07.780 回答
0

Location确实不是 json 可序列化的:该对象中有许多属性,并且没有单一的方法来表示位置,因此您必须自己选择一个。

您希望在location响应的键中看到什么类型的值?

这里有些例子:

文字地址

In [9]: json.dumps({'location': geolocator.geocode("175 5th Avenue NYC").address})
Out[9]: '{"location": "Flatiron Building, 175, 5th Avenue, Flatiron District, Manhattan Community Board 5, Manhattan, New York County, New York, 10010, United States of America"}'

点坐标

In [10]: json.dumps({'location': list(geolocator.geocode("175 5th Avenue NYC").point)})
Out[10]: '{"location": [40.7410861, -73.9896298241625, 0.0]}'

原始提名响应

(这可能不是您希望在 API 中公开的内容,假设您希望保留将地理编码服务更改为将来可能具有不同raw响应模式的另一个服务的能力)。

In [11]: json.dumps({'location': geolocator.geocode("175 5th Avenue NYC").raw})
Out[11]: '{"location": {"place_id": 138642704, "licence": "Data \\u00a9 OpenStreetMap contributors, ODbL 1.0. https://osm.org/copyright", "osm_type": "way", "osm_id": 264768896, "boundingbox": ["40.7407597", "40.7413004", "-73.9898715", "-73.9895014"], "lat": "40.7410861", "lon": "-73.9896298241625", "display_name": "Flatiron Building, 175, 5th Avenue, Flatiron District, Manhattan Community Board 5, Manhattan, New York County, New York, 10010, United States of America", "class": "tourism", "type": "attraction", "importance": 0.74059885426854, "icon": "https://nominatim.openstreetmap.org/images/mapicons/poi_point_of_interest.p.20.png"}}'

文字地址+点坐标

In [12]: location = geolocator.geocode("175 5th Avenue NYC")
    ...: json.dumps({'location': {
    ...:     'address': location.address,
    ...:     'point': list(location.point),
    ...: }})
Out[12]: '{"location": {"address": "Flatiron Building, 175, 5th Avenue, Flatiron District, Manhattan Community Board 5, Manhattan, New York County, New York, 10010, United States of America", "point": [40.7410861, -73.9896298241625, 0.0]}}'
于 2019-12-23T20:07:51.243 回答