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”