My 100daysofcode Journal (5 частей серии)
Эй, люди 👋🏻 !!
Я вернулся!! Опять ха-ха!
Итак, сегодня мы вместе будем в курсе Crud of Post/статьи, которые мы собрали вместе в Это блог Итак, как обычно, мы откроем наш файл BackeND/App.py и опубликовать наш заставить наш код выглядеть так:
'''Flask App For PyGuy WebSite''' from flask import (Flask, jsonify, render_template, request, session, make_response, abort, Response) from flask_jwt_extended import ( JWTManager, jwt_required, create_access_token, get_jwt_identity ) from flask_pymongo import PyMongo from flask_bcrypt import Bcrypt from bson.objectid import ObjectId from http import HTTPStatus # App Definitions & Configs app = Flask(__name__, root_path='../frontend') bcrypt = Bcrypt(app) jwt = JWTManager(app) app.config["MONGO_DBNAME"] = 'pysite' app.config["MONGO_URI"] = "mongodb://localhost:27017/pysite" app.secret_key = 'dawudawudbawbfawbfawc3241241j1jnjkjkn141nj4' app.config['JWT_SECRET_KEY'] = "dawudawudbawbfawbfawc3241241j1jnjkjkn141nj4" mongo = PyMongo(app) # This will be the index route .... @app.route("/api") def index(): return render_template("index.html") @app.route('/api/v1/posts', methods=['GET']) def articles(): articles = mongo.db.articles output = [] for q in articles.find(): output.append( {'title': q['title'], 'description': q['description'], 'tags': q['tags']}) return make_response({'code': 200, 'result': output}) @app.route("/api/v1/add_articles", methods=["POST"]) def add_articles(): """ add_articles [Adds new article] [Saves it to databases, with tags, description etc...] :return: [description] :rtype: [type] """ article = mongo.db.articles title = request.json['title'] description = request.json['description'] tags = request.json['tags'] article_id = article.insert( {'title': title, 'description': description, 'tags': tags}) new_article = article.find_one({'_id': article_id}) output = {'title': new_article['title'], 'description': new_article['description'], 'tags': new_article['tags']} return make_response({'code': 201, 'result': output}) @app.route("/api/v1/edit_article/", methods=["GET", "POST"]) def edit_article(article_id): article = mongo.db.articles title = request.json['title'] description = request.json['description'] tags = request.json['tags'] for art in article.find({"_id": ObjectId(article_id)}): if art['_id'] == ObjectId(article_id): updated_data = { 'title': title, 'description': description, 'tags': tags } existing_data = {"title": art['title'], "description": art['description'], "tags": art['tags']} if updated_data != existing_data: update_article = article.update( {"_id": art['_id']}, {"$set": updated_data}, upsert=False) return make_response({'code': 200, "Message": update_article}) else: return make_response({'code': 404, 'Message': 'No Code Updated'}) return make_response({'code': 404, "Message": "Article Not Found"}) @app.route("/api/v1/delete/ ", methods=["DELETE"]) def delete(article_id): article = mongo.db.articles for art in article.find({"_id": ObjectId(article_id)}): if art['_id'] == ObjectId(article_id): article.remove( {"_id": art['_id']}) return make_response({'code': 200, "Message": "Article Deleted Successfully"}) def new_user_creation(): """[User Creation] Params: Username Params: Password Uses: Bcrypt to generate Password Uses: Users Table """ user = mongo.db.users gen_hashpass = bcrypt.generate_password_hash(request.json['password']) user.insert( {'username': request.json['username'], 'password': gen_hashpass}) session['username'] = request.json['username'] @app.route("/api/v1/login", methods=['POST', 'GET']) def login(): """[Logins The User] Returns: [Access Token] -- [Returns access token, with code 200] [!Access Token] -- [Returns code 404] """ user = mongo.db.users username = request.json['username'] password = request.json['password'] for user_details in user.find(): if user_details['username'] == username and bcrypt.check_password_hash(user_details['password'], password): access_token = create_access_token(identity=username) return make_response({'code': 200, 'access_token': access_token, "Message": "Ok"}) return make_response({'code': 404, 'Message': "User Not Found, would you like to create one?"}) @app.route("/protected", methods=["GET"]) @jwt_required def protected(): """ protected [JWT] [extended_summary] Returns: [Success] -- [Return Current User If Login Is Successful] """ current_user = get_jwt_identity() return make_response({'code': 200, "logged_in_as": current_user}) @app.route("/api/v1/register", methods=['POST', 'GET']) def create_user(): """ create_user [Route call to create a user] [Uses the new_user_creation method] :return: [201, successfully created + Username] :rtype: [In case of failure, returns, 403] """ user = mongo.db.users # Users table definition for MongoDB if request.method == 'POST': user_exists = user.find_one({'username': request.json['username']}) if user_exists is None: new_user_creation() return make_response({'code': 201, "Message": "User {} has been created successfully".format(session['username'])}) return make_response({'code': 403, "Message": 'Already Exists'}) if __name__ == "__main__": app.run(debug=True)
Теперь давайте пройдемся по коду, как мы Alwaaaaaaays do 😁.
Во-первых, мы сделаем некоторую фактуру (не знаю, как я должен использовать слово каждый день)
Мы представим, DOCSTRING, потому что мы будем представлять Swarger позже для документирования. Поэтому мы сделали что-то вроде:
""" add_articles [Adds new article] [Saves it to databases, with tags, description etc...] :return: [description] :rtype: [type] """
РЕДАКТИРОВАТЬ ПОСТ
Теперь мы теперь сделаем наш путь редактирования/обновления в нашем Crud. Давайте сделаем это сейчас …
@app.route("/api/v1/edit_article/", _methods_=["GET", "POST"]) _def_ edit_article(_article_id_): article = mongo.db.articles title = request.json['title'] description = request.json['description'] tags = request.json['tags']
Код выше, в значительной степени же в каждом маршруте. Поэтому мы не можем просто пропустить это и идти к следующей части …
Итак, в коде ниже я буду петлю через статьи, используя ключевое слово Art (не очень хорошее использование ключевых слов ME 😒) и ищите удостоверение личности, мы пройдем в качестве параметра в
@app.route("/api/v1/edit_article/", _methods_=["GET", "POST"])
Уведомление, article_id Передано как параметр здесь, мы будем использовать его рядом.
Чем мы сравним, если Article_Id, которые мы проходим, делает матчи с идентификатором статьи в сборе. Если да, мы определим словарь update_data, которые будут данными, которые мы будем удерживать данные, которые мы будем обновлять.
for art in article.find({"_id": ObjectId(article_id)}): if art['_id'] == ObjectId(article_id): updated_data = { 'title': title, 'description': description, 'tags': tags }
Теперь, далее мы определим наш существующий словарь, что означает, что данные, которые мы в настоящее время сохранены в нашей БД ..
existing_data = {"title": art['title'], "description": art['description'], "tags": art['tags']}
Хорошо, следующий шаг – мы проверим, если наши данные, которые мы передаем как данные, которые будут обновлены, это равный или не равный к наши существующие данные. Если данные не совпадают с нашими существующими данными, он будет обновляться, с помощью Upsert набор на False (объяснит, что такое UPSERT).
if updated_data != existing_data: update_article = article.update( {"_id": art['_id']}, {"$set": updated_data}, _upsert_=False) return make_response({'code': 200, "Message": update_article}) else: return make_response({'code': 404, 'Message': 'No Code Updated'})
Мы можем проверить то же самое в нашей базе данных, позвольте мне показать вам, чтобы подтвердить, что работает.
Это данные, которые я вижу, когда я просматриваю мою коллекцию
{ "title": "Hi this is the blacksheep post", "description": "This ïś the aæaãaæaãaæaãaæaãaæaãaæaã", "tags": "hi, testing, zero post" }
Чтобы проверить, будут ли данные обновления.
Мы отправим новые данные запроса, установленные так.
{ "title": "Hi this is the this is awesome post", "description": "This ïś the awesome post", "tags": "hi, testing, awesome post" }
Сделайте запрос на обновление статьи, подобное это из нашего пути Edit_article, ваш идентификатор статьи будет другим случаем в моем случае это 5DBB07A99B5D9FC1D7127FA8
Так что это будет обновлено, верно? Давайте посмотрим в нашей БД, если это обновлено
УРА!! Наши данные были обновлены 🙌 🏻.
Удалить пост
Так что следующая остановка .. Удалить. Для этого мы будем использовать метод « Удалить ». Давайте проверим код, чтобы удалить. Ниже приведен код использует метод удаления с помощью Article_ID в качестве параметра.
@app.route("/api/v1/delete/", _methods_=["DELETE"]) def delete(_article_id_): article = mongo.db.articles for art in article.find({"_id": ObjectId(article_id)}): if art['_id'] == ObjectId(article_id): article.remove( {"_id": art['_id']}) return make_response({'code': 200, "Message": "Article Deleted Successfully"})
Итак, мы снова будем использовать петлю с методом .find ищет ID ключ, который имеет article_ID в качестве значения. P.S ObjectID – это метод, импортированный из BSON. ObjectID, чтобы фактически преобразовать идентификатор параметра как Mongo совместимым и выполнять сравнение.
Мы, чем сделали блок IF/Ever, чтобы сделать сравнение и чем называется .remove Способ удаления соответствующего поста с этой статьей.
Давайте посмотрим, как мы сделали это удалить звонок в почтовике, пропустите относительную статью I d
Когда вы попадаете, отправьте, он удалит связанный пост. Вы можете проверить коллекцию, чтобы увидеть, будет ли пост фактически удален.
Потрясающие!!! Мы удалили наш пост …
Это люди .. Мы успешно сделали реализацию CRUD на наших постах.
My 100daysofcode Journal (5 частей серии)
Оригинал: “https://dev.to/ihackthings/my-100daysofcode-journal-day-05-58j2”