• Flask接口设计和数据库设计


    Flask接口设计和数据库设计

    1、技术概述,描述这个技术是做什么?学习该技术的原因,技术的难点在哪里。

      使用Flask框架进行程序后端的接口设计和数据库,之所以学习是为了完成团队项目中后端笔记部分的接口,难点是之前为接触过Flask,学习起来有一定难度,对路由和ORM等不了解。

    2、技术详述,描述你是如何实现和使用该技术的,要求配合代码和流程图详细描述。

    • 1、先建note.py文件到时在里面写路由。
    import json
    import os
    from datetime import datetime
    
    from flask import Blueprint,request,current_app,send_from_directory
    from flask_login import current_user,login_user,logout_user
    from ..models.note import Note,File,Compliments
    from ..extensions import db
    from ..models.user import User
    from ..utils import random_filename
    
    
    note_bp = Blueprint('note',__name__)
    
    @note_bp.before_request   #!@#!@#
    def login_project():
        route = ['avatar','file']
        method = request.method
        ext = request.path
        flag = False
    
        for i in route :
            if i in ext :
                flag = True
    
        if method == 'GET' and flag :
            pass
    
        else :
            result = {}
            if current_user.is_authenticated == False:
                result['code'] = -1
                result['msg'] = '您当前未登录!'
                return json.dumps(result)
    
            else :
                id =current_user.get_id()
                user = User.query.get(id)
    
                if user.is_verify == False and user.is_admin == False:
                    result['code'] = -2
                    result['msg'] = '请先实名制认证!'
                    return json.dumps(result)
    
    @note_bp.route('',methods=['POST'])
    def release():
        results = {}
        data = {}
        title = request.form.get('title')
        tag = request.form.get('tag')
        content = request.form.get('content')
    
        uid = int(current_user.get_id())
    
        note = Note(
            title = title,
            tag = tag,
            content = content,
            note_date = datetime.today(),
            user_id = uid
        )
    
        db.session.add(note)
        db.session.commit()
    
        data['id'] = note.id
        results['code'] = 0
        results['msg'] = '发布成功'
        results['data'] = data
    
        return json.dumps(results)
    
    @note_bp.route('/published',methods=['GET'])
    def my_published():
        results = {}
        data = []
        id = int(current_user.get_id())
    
        notes = Note.query.filter_by(user_id=id).order_by(Note.note_date.desc()).all()
    
        if notes != None :
            for item in notes:
                flag = True
                cc = Compliments.query.filter_by(note_id=item.id, user_id=id).first()
                if cc is None:
                    flag = False
    
                d = {
                    "note_id" : item.id,
                    "title" : item.title,
                    "tag" : item.tag,
                    "content" : item.content[0:32] + '...' ,
                    "compliments" : item.compliments,
                    "flag" : flag,
                    "note_date" : item.note_date.strftime('%Y-%m-%d'),
                }
                data.append(d)
    
        results['code'] = 0
        results['msg'] = 'success'
        results['data'] = data
    
        return json.dumps(results)
    
    @note_bp.route('/search',methods=['GET'])
    def search():
        results = {}
        Data = []
        data = []
        word = str(request.args.get('word'))
    
        notes = Note.query.order_by(Note.note_date.desc()).all()
    
        if word != None:
            words = word.split(' ')
            for i in words:
                for note in notes:
                    if i in note.tag:
                        if note not in Data:
                            flag = True
                            cc = Compliments.query.filter_by(note_id=note.id, user_id=current_user.id).first()
                            if cc is None :
                                flag = False
                            d = {
                                "publisher_id": note.user_id,
                                'publisher_nickname': note.user.nickname,
                                'note_id' : note.id,
                                'title': note.title,
                                'tag': note.tag,
                                'content': note.content,
                                "note_date": note.note_date.strftime('%Y-%m-%d'),
                                "compliments" : note.compliments,
                                "flag" : flag
                            }
    
                            Data.append(note)
                            data.append(d)
    
            results['code'] = 0
            results['msg'] = "查找成功"
            results['data'] = data
    
        return json.dumps(results)
    
    @note_bp.route('/<int:id>',methods=['GET'])
    def note(id):
        results = {}
        note = Note.query.get(id)
    
        flag = True#current_user.id
        cc = Compliments.query.filter_by(note_id=id, user_id=current_user.id).first()
        if cc is None:
            flag = False
    
        data = {
            "publisher_id" : note.user_id,
            "title" : note.title,
            "tag" : note.tag,
            "content" : note.content,
            "note_date" : note.note_date.strftime('%Y-%m-%d'),
            "compliments" : note.compliments,
            "flag" : flag
        }
    
        results['code'] = 0
        results['msg'] = '查看成功'
        results['data'] = data
    
        return json.dumps(results)
    
    @note_bp.route('/upload',methods=['POST'])
    def upload():
        results = {}
        f = request.files.get('file')
    
        filename = random_filename(f.filename)
    
        f.save(os.path.join(current_app.config['FILE_PATH'], filename))
    
        file = File(
            filename=filename
        )
    
        db.session.add(file)
        db.session.commit()
    
        data = {
            "file_id":file.id
        }
    
        results['code'] = 0
        results['msg'] = '上传成功'
        results['data'] = data
    
        return json.dumps(results)
    
    @note_bp.route('/file/<int:id>',methods=['GET'])
    def get_file(id):
        file = File.query.get(id)
        filename = file.filename
    
        return send_from_directory(current_app.config['FILE_PATH'], filename)
    
    @note_bp.route('/categories',methods=['GET'])
    def categories():
        results = {}
        data = []
        notes = Note.query.all()
        for note in notes :
            if note.tag not in data:
                data.append(note.tag)
    
        results['code'] = 0
        results['msg'] = 'success'
        results['data'] = data
    
        return json.dumps(results)
    
    @note_bp.route('/index',methods=['GET'])
    def index():
        results={}
        data = []
    
        tag = request.args.get('tag')
        page = int(request.args.get('page'))
        each_page = int(request.args.get('each_page'))
    
        length = Note.query.filter_by(tag=tag).count()
        pagination = Note.query.filter_by(tag=tag).order_by(Note.note_date.desc()).paginate(page,per_page=each_page)
        notes = pagination.items
    
        for note in notes :
            flag = True
            cc = Compliments.query.filter_by(note_id=note.id, user_id=current_user.id).first()
            if cc is None:
                flag = False
    
            d = {}
            d["publisher_id"] = note.user_id
            d["publisher_nickname"] = note.user.nickname
            d["note_id"] = note.id
            d["title"] = note.title
            d["content"] = note.content[0:32] +'...'
            d["note_date"] = note.note_date.strftime('%Y-%m-%d')
            d["compliments"] = note.compliments
            d['flag'] = flag
    
            data.append(d)
    
        results['code'] = 0
        results['msg'] = '返回成功'
        results['data'] = data
        results['length'] = length
    
        return json.dumps(results)
    
    @note_bp.route('/edit',methods=['POST'])
    def edit():
        results = {}
        id = request.form.get('note_id')
        content = request.form.get('content')
    
        note = Note.query.get(id)
        note.content = content
        note.note_date = datetime.today()
    
        db.session.commit()
    
        results['code'] = 0
        results['msg'] = '修改成功'
    
        return json.dumps(results)
    
    @note_bp.route('/compliments',methods=['POST'])
    def compliments():
        results = {}
    
        id = request.form.get('note_id')
        uid = current_user.id
    
        cc = Compliments.query.filter_by(note_id=id, user_id=uid).first()
        if cc != None :
            results['code'] = 1
            results['msg'] = '你已经点过赞了'
    
            return json.dumps(results)
    
        c = Compliments(
            note_id = id,
            user_id = uid
        )
    
        note = Note.query.get(id)
        note.compliments += 1
    
        db.session.add(c)
        db.session.commit()
    
        results['code'] = 0
        results['msg'] = '点赞成功'
    
        return json.dumps(results)
    
    @note_bp.route('/recomp',methods=['POST'])
    def recomp():
        results = {}
    
        id = request.form.get('note_id')
        uid = current_user.id
    
        c = Compliments.query.filter_by(note_id = id,user_id = uid).first()
    
        note = Note.query.get(id)
        note.compliments -= 1
    
        db.session.delete(c)
        db.session.commit()
    
        results['code'] = 0
        results['msg'] = '取消点赞成功'
    
        return json.dumps(results)
      
    
    • 2、在modules里建notes.py。
    from ..extensions import db
    from ..models.user import User
    
    
    class Note(db.Model):
    
        id = db.Column(db.Integer, primary_key=True)
        title = db.Column(db.String(32), nullable=False)  # 标题
        compliments = db.Column(db.Integer, default=0)  # 点赞数
        note_date = db.Column(db.TIMESTAMP, nullable=False)  # 笔记最近一次更新时间
        tag = db.Column(db.String(32),nullable=False)
        content = db.Column(db.Text)
    
        user_id = db.Column(db.Integer, db.ForeignKey('user.id'))  #谁发布的
    
        user = db.relationship('User', back_populates='notes')  # 用户
        comps = db.relationship('Compliments', back_populates='note')
    
    
    class File(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        filename = db.Column(db.String(128),nullable=False,unique=True)
    
    class Compliments(db.Model):
        id = db.Column(db.Integer, primary_key=True)
    
        user_id = db.Column(db.Integer, db.ForeignKey('user.id'))  # 谁点赞的
        note_id = db.Column(db.Integer, db.ForeignKey('note.id'))  # 谁点赞的
    
        note = db.relationship('Note', back_populates='comps')  # 用户
        user = db.relationship('User', back_populates='comps')  # 用户
    
      
    
    • 3、根据数据库设计用ORM实现即可。

    3、技术使用中遇到的问题和解决过程。

      刚刚开始的时候对路由的概念不了解,所以先进行了学习,使用的书是《Flask Web开发:Python基于Web应用开发实战 第 2 版 》关于路由的定义

    @app.route('/user/<name>') 
    def user(name):     
    return '<h1>Hello, {}!</h1>'.format(name)
    

    了解之后直接就可以上手了,比较简单,数据库使用时碰到的问题是在使用db.create_all() 时出现了一些问题,原因是一些表已经存在了,但是使用它时不会重新创建或者更新相应的表,于是我先删除旧表再重新创建,然后就一切顺利

    >>> db.drop_all() 
    >>> db.create_all()
    

    4、进行总结

      初学的时候感觉压力很大,因为时间赶,加上我觉得它难度比较大,后面逼着自己学习才发现这个技术还是比较简单的,中间碰到的问题通过百度和电子书查看实例都能够解决,所以说不要去害怕学习新的知识,只要用心打的去学习了,就会有收获。

    5、列出参考文献、参考博客(标题、作者、链接)。

    《Flask Web开发:Python基于Web应用开发实战 第 2 版 》
    Flask中路由使用解析

  • 相关阅读:
    步步为营VS 2008 + .NET 3.5(3) C# 3.0新特性之Automatic Properties(自动属性)、Object Initializers(对象初始化器)、Collection Initializers(集合初始化器)和Extension Methods(扩展方法)
    新瓶旧酒ASP.NET AJAX(10) 客户端脚本编程(Sys.Services命名空间下的类)
    步步为营VS 2008 + .NET 3.5(2) VS 2008新特性之JavaScript Intellisense and Debugging(JavaScript的智能感知和调试)
    新瓶旧酒ASP.NET AJAX(8) 客户端脚本编程(Sys.Net命名空间下的WebRequestManager、WebRequest、WebRequestExecutor和XMLHttpExecutor)
    步步为营VS 2008 + .NET 3.5(11) DLINQ(LINQ to SQL)之大数据量分页、延迟执行和日志记录
    步步为营VS 2008 + .NET 3.5(14) XLINQ(LINQ to XML)之针对XML文件的添加、查询、更新和删除
    [翻译]ASP.NET 2.0中的健康监测系统(Health Monitoring)(3) 触发自定义事件
    稳扎稳打Silverlight(2) 1.0实例之支持录音和回放的钢琴(Silverlight+ASP.NET AJAX+DLINQ)
    步步为营VS 2008 + .NET 3.5(7) LINQ查询操作符之First、FirstOrDefault、Last、LastOrDefault、ElementAt、ElementAtOrDefault、Contains、Any、All、Count、LongCount、Sum、Min、Max、Average、Aggregate、Cast、DefaultIfEmpty、SequenceEqual、OfType、ToArray、ToList、ToDictionary
    步步为营VS 2008 + .NET 3.5(1) VS 2008新特性之Multi Targeting(多定向)、Web Designer and CSS(集成了CSS的web设计器)和Nested Master Page(嵌套母版页)
  • 原文地址:https://www.cnblogs.com/shenmw/p/13190554.html
Copyright © 2020-2023  润新知