├── .gitignore ├── Dockerfile ├── README.md ├── docker-compose.yml ├── requests └── users.http ├── requirements.txt └── src └── app.py /.gitignore: -------------------------------------------------------------------------------- 1 | venv 2 | .vscode 3 | __pycache__ -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.8-alpine 2 | 3 | WORKDIR /code 4 | 5 | ENV FLASK_APP=src/app.py 6 | ENV FLASK_RUN_HOST=0.0.0.0 7 | 8 | RUN apk add --no-cache gcc musl-dev linux-headers 9 | 10 | COPY requirements.txt requirements.txt 11 | 12 | RUN pip install -r requirements.txt 13 | 14 | EXPOSE 3000 15 | 16 | COPY . . 17 | 18 | CMD ["flask", "run", "--port=3000"] -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Flask and Mongodb RESTAPI 2 | 3 | This application is a REST API CRUD using Python Flask and mongodb module Flask-Pymongo 4 | 5 | ### Installation with docker-compose (Recommended) 6 | 7 | ``` 8 | docker-compose up 9 | ``` 10 | 11 | now you can visit: http://localhost:3000 -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3.9" 2 | 3 | services: 4 | web: 5 | build: . 6 | ports: 7 | - "3000:3000" 8 | database: 9 | image: mongo 10 | restart: always 11 | ports: 12 | - 27017:27017 -------------------------------------------------------------------------------- /requests/users.http: -------------------------------------------------------------------------------- 1 | @api = http://localhost:3000/users 2 | 3 | ### get users 4 | GET {{api}} 5 | 6 | ### create user 7 | 8 | POST {{api}} 9 | Content-Type: application/json 10 | 11 | { 12 | "username": "fazt", 13 | "email": "fazt@gmail.com", 14 | "password": "faztpassword" 15 | } 16 | 17 | ### get single user 18 | 19 | GET {{api}}/61739ba713715cdb939882cc 20 | 21 | ### update single user 22 | PUT {{api}}/61739ba713715cdb939882cc 23 | Content-Type: application/json 24 | 25 | { 26 | "username": "Ryan", 27 | "email": "ryan@gmail.com", 28 | "password": "ryanpassword" 29 | } 30 | 31 | ### delete single user 32 | DELETE {{api}}/61739ba713715cdb939882cc 33 | 34 | ### 404 35 | GET http://localhost:3000/asdasdad -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | black==21.9b0 2 | click==8.0.3 3 | Flask==2.0.2 4 | Flask-PyMongo==2.3.0 5 | itsdangerous==2.0.1 6 | Jinja2==3.0.2 7 | MarkupSafe==2.0.1 8 | mypy-extensions==0.4.3 9 | pathspec==0.9.0 10 | platformdirs==2.4.0 11 | pymongo==3.12.1 12 | regex==2021.10.23 13 | tomli==1.2.1 14 | typing-extensions==3.10.0.2 15 | Werkzeug==2.0.2 16 | -------------------------------------------------------------------------------- /src/app.py: -------------------------------------------------------------------------------- 1 | from flask import Flask, jsonify, request, Response 2 | from flask_pymongo import PyMongo 3 | from bson import json_util 4 | from bson.objectid import ObjectId 5 | 6 | from werkzeug.security import generate_password_hash, check_password_hash 7 | 8 | app = Flask(__name__) 9 | 10 | app.secret_key = 'myawesomesecretkey' 11 | 12 | app.config['MONGO_URI'] = 'mongodb://database/pythonmongodb' 13 | 14 | mongo = PyMongo(app) 15 | 16 | 17 | @app.route('/users', methods=['POST']) 18 | def create_user(): 19 | # Receiving Data 20 | username = request.json['username'] 21 | email = request.json['email'] 22 | password = request.json['password'] 23 | 24 | if username and email and password: 25 | hashed_password = generate_password_hash(password) 26 | id = mongo.db.users.insert( 27 | {'username': username, 'email': email, 'password': hashed_password}) 28 | response = jsonify({ 29 | '_id': str(id), 30 | 'username': username, 31 | 'password': password, 32 | 'email': email 33 | }) 34 | response.status_code = 201 35 | return response 36 | else: 37 | return not_found() 38 | 39 | 40 | @app.route('/users', methods=['GET']) 41 | def get_users(): 42 | users = mongo.db.users.find() 43 | response = json_util.dumps(users) 44 | return Response(response, mimetype="application/json") 45 | 46 | 47 | @app.route('/users/', methods=['GET']) 48 | def get_user(id): 49 | print(id) 50 | user = mongo.db.users.find_one({'_id': ObjectId(id), }) 51 | response = json_util.dumps(user) 52 | return Response(response, mimetype="application/json") 53 | 54 | 55 | @app.route('/users/', methods=['DELETE']) 56 | def delete_user(id): 57 | mongo.db.users.delete_one({'_id': ObjectId(id)}) 58 | response = jsonify({'message': 'User' + id + ' Deleted Successfully'}) 59 | response.status_code = 200 60 | return response 61 | 62 | 63 | @app.route('/users/<_id>', methods=['PUT']) 64 | def update_user(_id): 65 | username = request.json['username'] 66 | email = request.json['email'] 67 | password = request.json['password'] 68 | if username and email and password and _id: 69 | hashed_password = generate_password_hash(password) 70 | mongo.db.users.update_one( 71 | {'_id': ObjectId(_id['$oid']) if '$oid' in _id else ObjectId(_id)}, {'$set': {'username': username, 'email': email, 'password': hashed_password}}) 72 | response = jsonify({'message': 'User' + _id + 'Updated Successfuly'}) 73 | response.status_code = 200 74 | return response 75 | else: 76 | return not_found() 77 | 78 | 79 | @app.errorhandler(404) 80 | def not_found(error=None): 81 | message = { 82 | 'message': 'Resource Not Found ' + request.url, 83 | 'status': 404 84 | } 85 | response = jsonify(message) 86 | response.status_code = 404 87 | return response 88 | 89 | 90 | if __name__ == "__main__": 91 | app.run(debug=True, port=3000) 92 | --------------------------------------------------------------------------------