Flask+Vue 構建個人博客02 ---文章模塊

  • 分享一個前後端分離(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")

這樣就全部編寫完成了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章