【问题标题】:Setting up a password identification in Flask-Restful to work with mongoDB在 Flask-Restful 中设置密码识别以使用 mongoDB
【发布时间】:2017-07-19 01:02:54
【问题描述】:

对于一个菜鸟问题,提前抱歉。 一些背景:我以前几乎没有在 Flask 或 mongoDB 中工作的经验。三天前,我的一个熟人联系了我,他说他们的开发工作室有一个职位空缺,如果我能证明自己能够在短时间内学习必要的工具,他们会接受我担任实习生职位。 碰巧的是,我的成功是断断续续的。设置必要的环境很容易。我使用 Visual Studio Code for Windows、Robo 3T 和 Python(3.5) 的 Requests 模块作为附加工具。该项目本身使用 mongoDB 和 Flask-RESTful API 来操作其中的数据。在工作室的人的坚持下,我正在使用 curl。 测试任务是设置一个 mongoDB 和 Flask-RESTful API,然后使用后者在数据库中存储一些名称和密码实例,并让使用正确名称和密码组合发出的 GET 请求获得加密令牌;出现“403”以响应不正确的组合。 对于基础,我正在使用此处的说明: http://salmanwahed.github.io/2015/05/01/flask-restful-mongodb-api/ 经过一些修改,我想出了这个“创意”代码:

from flask import Flask, jsonify, url_for, redirect, request
from flask_pymongo import PyMongo
from flask_restful import Api, Resource

app = Flask(__name__)
app.config["MONGO_DBNAME"] = "access_db"
mongo = PyMongo(app, config_prefix='MONGO')
APP_URL = "http://127.0.0.1:5000"


class Access(Resource):
    def get(self, name=None, password=None):
        data = []
        access_info = mongo.db.access.find_one({"name": name}, {"_id": 0})
        print(access_info)
        password_info = access_info['password']
        if access_info:
            if password_info:
                return jsonify({"token": "1111111111"})
            else:
                return make_response(jsonify({'error': 'Unauthorized access'}), 403)
        else:
            return make_response(jsonify({'error': 'Unauthorized access'}), 403)


    def post(self):
        data = request.get_json()
        if not data:
            print(data)
            data = {"response": "ERROR"}
            return jsonify(data)
        else:
            name = data.get('name')
            if name:
                if mongo.db.access.find_one({"name": name}):
                    return {"response": "name already exists."}
                else:
                    mongo.db.access.insert(data)
            else:
                return {"response": "name missing"}

    def put(self, name):
        data = request.get_json()
        mongo.db.access.update({'name': name}, {'$set': data})


    def delete(self, name):
        mongo.db.access.remove({'name': name})

class Index(Resource):
    def get(self):
        return redirect(url_for("students"))


api = Api(app)
api.add_resource(Index, "/", endpoint="index")
api.add_resource(Access, "/api", endpoint="access")
api.add_resource(Access, "/api/<string:name>", endpoint="name")

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

虽然它似乎正在存储名称和密码,但它在这样做时返回“Null”,当我尝试提取令牌时,它给了我这个: https://pastebin.com/86hE1CCW 谁能向我指出为什么 password_info = access_info['password'] 返回“null”(如果确实如此),或者提供建议/源材料以更好地设计处理任务的方式?

【问题讨论】:

  • 根据您的日志,access_info 为空,这意味着它没有找到您的记录。为什么要传入条件 _id = 0?
  • 主要是因为我不真的了解 Flask 使用的三分之一的合成器。我在原始代码中看到了这一点(有效),并认为这是要走的路。
  • 实际上,这是一个有效的查询结构。 _id:0 不是条件,而是查询投影的一部分。意思是“返回除_id 字段之外的所有字段”。另请参阅query - suppress-id-field 了解更多信息。

标签: python mongodb rest curl


【解决方案1】:

谁能告诉我为什么 password_info = access_info['password'] 返回“null”

这是因为您的 find_one 查询没有返回匹配的记录。查看您的输出日志,这是由针对GET 的不正确的curl 命令引起的。

使用下面的curl 命令未能为GET 指定namepassword

curl -i -H "Accept: application/json" "127.0.0.1:5000/api/{"username":"progen", "password":"123123"}" 
curl -G "{\"name\": \"progen\", \"password\": \"123123\"}" -H "Content-Type: application/json" 127.0.0.1:5000/api

结果,您对find_one 的查询试图找到值为Nonename 字段。 access_db 数据库中不存在,因此根本不返回任何记录。

根据您的代码(未经修改),您可以使用下面的curl

curl -G 127.0.0.1:5000/api/progen

其中progen 将作为name 变量传递到get()

请参阅flask-restful: quickstart 了解更多信息。

我还建议您考虑添加一些验证。即在进入下一个代码块之前检查传入的输入和输出。 您应该考虑在代码块中可能发生的事情的可能性。

另外,根据您的 MongoDB 服务器版本,我建议使用最新的稳定版本 PyMongo 3.4

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 2014-12-23
    • 1970-01-01
    • 2018-08-05
    • 2014-09-04
    • 1970-01-01
    相关资源
    最近更新 更多