在Flask-Restful中设置密码标识以使用mongoDB

时间:2017-07-19 01:02:55

标签: python mongodb rest curl

并提前抱歉为一个菜鸟问题。 一些背景:我以前几乎没有使用Flask或mongoDB的经验。三天前,我和我的熟人联系过,他说他们在开发工作室有一个空缺,如果我证明自己有能力在短时间内学习必要的工具,他们就会接受我的实习生位置。 事实上,我的成功是停止和喷射。设置必要的环境很容易。我使用Visual Studio Code for Windows,Robo 3T和Requests for Python(3.5)作为附加工具。该项目本身使用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)

虽然它似乎存储了名称和密码,但它返回&#34; Null&#34;这样做,当我试图拉动令牌时,它给了我这个: https://pastebin.com/86hE1CCW 任何人都可以向我指出为什么密码password_info = access_info [&#39;密码&#39;]返回&#34; null&#34;(如果它那样做),或者为更好设计的方式提供建议/源材料处理任务?

1 个答案:

答案 0 :(得分:0)

  

有人可以向我指出为什么密码password_info = access_info [&#39;密码&#39;]返回&#34; null&#34;

这是因为您的find_one查询没有返回匹配的记录。查看输出日志,这是由curl的{​​{1}}命令错误引起的。

以下两个GET命令的使用未能为curl指定namepassword

GET

结果,您对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的{​​{1}}字段。您的name数据库中不存在该数据库,因此根本不返回任何记录。

根据您的代码(不做修改),您可以使用None下面的代码:

access_db

curl作为curl -G 127.0.0.1:5000/api/progen 变量传递到progen的位置。

有关详细信息,请参阅flask-restful: quickstart

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

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