Рубрики
Без рубрики

Мой 100daysofcode Journal Day – 05

Эй, люди 👋🏻 !! Я вернулся!! Опять ха-ха! Итак, сегодня мы вместе будем в курсе грудного поста / статьи, которые … Теги с Python, WebDev, Code, Flask.

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”