- 分享一個前後端分離(Python3 + Flask +Vuew)的個人博客,一個使用Python Flask 框架編寫的個人博客。項目很輕。卻很實用。
- GitHub地址:哆啦瞎夢
- 技術棧:Flask、Vue、Docker
文章需要編寫的API
url | 路徑說明 | 參數說明 | 功能 | 權限 |
---|---|---|---|---|
/articles?page | 下一頁 | page控制下一頁(不可以爲1) | 下一頁 | - |
/articles?page=2&pageSize=1 | 下一頁,每一頁1個 | page控制下一頁;pageSize:控制頁數 | 下一頁,每一頁1個 | - |
/articles | 發佈文章 | None | 增 | admin |
/articles/id | 修改指定文章 | id:文章id | 修改 | admin |
model部分編寫
# 所有的model我都編寫在biz>orm>api.py中了
from _datetime import datetime
from uuid import uuid4
from sqlalchemy import *
from sqlalchemy.orm import relationship, backref,reconstructor
from common.opensource_tools.db_manage.sqlalchemy_pack import DictBase
from flask_app.orm.base import BaseModel
class Article(BaseModel):
__tablename__ = 't_article'
id = Column(u'id', Integer, primary_key=True, autoincrement=True)
title = Column(u'title', VARCHAR(64), nullable=False)
author_id = Column(u'author_id', Integer, nullable=False)
content = Column(u'content', TEXT)
status = Column(u'status', Integer, default=0)
create_at = Column(u'create_at', DateTime, default=datetime.now)
modify_at = Column(u'modify_at', DATETIME, default=datetime.now)
model部分編寫完成
view視圖編寫
此處邊寫get請求(獲取分頁)和POST請求(上傳)
class ArticleHandle(BaseModelHandler):
def get(self):
if self.need_pagination:
page = int(request.args.get('page',1))
page_size = int(request.args.get('pageSize',50))
page = page-1 if page>0 else 0
obj = Article.query.filter_by().paginate(page=page, per_page=page_size).items
obj_list = len(obj)
obj = [x.to_dict() for x in obj]
return common_response(self, 200, {"page": page + 1,
"pageSize":page_size,
"data":obj,
"totalCount":obj_list
})
obj=Article.query.filter_by().all()
obj = [x.to_dict() for x in obj]
return common_response(self, 200, obj)
def post(self):
form = ArticleForm().validate_for_api(Article)
obj = Article.from_dict(form.data)
obj.insert()
obj_dict = obj.to_dict()
return common_response(self, 201, obj_dict)
其實只要在基礎結構搭建好之後,後面的業務模塊很多都是重複的
- 現在編寫 POST請求
class ArticleSingleHandle(BaseModelHandler):
def get(self, article_id):
article_obj = Article.query.filter_by(id=article_id).first()
if not article_obj:
raise NotFoundError(msg="表%s:沒找到id爲%s" % (Article.__tablename__, article_id), error_code=10002)
obj = article_obj.to_dict()
return common_response(self, 200, obj)
def put(self, article_id):
article_obj = Article.query.filter_by(id=article_id).first()
if not article_obj:
raise NotFoundError(msg="表%s:沒找到id爲%s" % (Article.__tablename__, article_id), error_code=10002)
form = ArticlePutForm().validate_for_api(Article)
if form.data.get('author_id'):
raise ParaValidateFailError(msg="author_id字段是不可編輯字段",error_code=10003)
up_article_obj = article_obj.update_from_json(json.dumps(form.data))
up_article_obj.update()
obj = up_article_obj.to_dict()
return common_response(self, 201, obj)
def delete(self, article_id):
article_obj = Article.query.filter_by(id=article_id).first()
if not article_obj:
raise NotFoundError(msg="表%s:沒找到id爲%s" % (Article.__tablename__, article_id), error_code=10002)
article_obj.status = -1
article_obj.update()
return common_response(self, 201, '')
這樣一個簡單的文章上傳修改刪除的api就完成了
最後一步 在v1中需要註冊一下
# 在apps>v1>init中register_views添加
api.add_resource(ArticleHandle, '/articles', endpoint="article_list",
resource_class_kwargs=dict(pagination=True
)
)
api.add_resource(ArticleSingleHandle, '/article/<int:article_id>', endpoint="article_detail")
這樣就全部編寫完成了