> 백엔드 개발 > 파이썬 튜토리얼 > Flask Blueprint 및 SQLAlchemy를 사용하여 Python 애플리케이션을 작성하는 방법

Flask Blueprint 및 SQLAlchemy를 사용하여 Python 애플리케이션을 작성하는 방법

PHPz
풀어 주다: 2023-05-06 19:28:15
앞으로
961명이 탐색했습니다.

    설치 준비

    python3 -V && pip3 -V
    pip3 install pipenv
    로그인 후 복사

    pipenv

    pipenv shell
    로그인 후 복사

    PyCharm의 환경 구성은 여기에서 자세히 설명하지 않습니다. 다음은 후속 코드에 대한 설명입니다.

    연습 시작

    Flask의 원리는 앱이 초기화될 때 웹 라우팅 기능을 구현하기 위해 청사진과 앱을 바인딩하는 것입니다. 라우팅 구현은 모든 프로젝트의 첫 번째 단계입니다.

    엔트리 파일

    프로젝트를 시작하기 전에 앱 인스턴스화 요청을 허용하는 엔트리 파일을 정의하세요. 엔트리 파일이 해야 할 일은 구성 파일 초기화, 컨트롤러 도입, 데이터베이스 초기화 및 기타 작업입니다.

    def create_app():
        app = Flask(__name__)
        # 导入config中的配置文件
        app.config.from_object('app.config.setting')
        app.config.from_object('app.config.secure')
        return app
    로그인 후 복사

    시작 파일에 호출. 판단은 시작 파일에 추가해야 합니다. 이유는 나중에 설명하겠습니다.

    from app.app import create_app
    app = create_app()
    if __name__ == '__main__':
        app.run(debug =True,port=81,host= '0.0.0.0')
    로그인 후 복사

    Routing

    Flask는 블루프린트를 이용하여 구현한 라우팅 기능입니다. 엔트리 파일에 블루프린트를 등록하는 메소드를 추가하여 소개 및 등록을 구현합니다.

    from flask import Blueprint
    login = Blueprint('login', __name__)
    @login.route('/login')
    def loginIndex():
        return "login Hello"
    로그인 후 복사

    앱 인스턴스 초기화 시 블루프린트 모듈 도입

    from flask import Flask
    def create_app():
        app = Flask(__name__)
        # 导入config中的配置文件
        app.config.from_object('app.config.setting')
        app.config.from_object('app.config.secure')
        # 注册并导入蓝图
        register_blue(app)
        return app
    def register_blue(app):
        from app.api.login import login
        app.register_blueprint(login)
    로그인 후 복사

    라우터 최적화

    각 라우터에 로더를 추가하고, 초기화 중에 Flask에 블루프린트를 순차적으로 로드하여 라우터 최적화 목적을 달성할 수 있습니다.

    class BaseRoutes:
        def __init__(self, name):
            self.name = name
            self.loader = []
        def route(self, rule, **options):
            def decorator(f):
                self.loader.append((f, rule, options))
                return f
            return decorator
        def register(self, bp, url_prefix=''):
            # 依次注册蓝图
            for f, rule, options in self.loader:
                endpoint = options.pop("endpoint", f.__name__)
                bp.add_url_rule(url_prefix + rule, endpoint, f, **options)
    로그인 후 복사

    api 파일에 사용된 최적화된 로더 코드는 다음과 같습니다.

    from app.libs.BaseRoutes import BaseRoutes
    api = BaseRoutes('login')
    @api.route('/login/loginHandle', methods=['GET', 'POST'])
    def loginHandle():
        return "login Hello"
    로그인 후 복사

    SQLAlchemy

    웹 라우팅을 완료한 후 Flask의 추가, 삭제, 수정 및 쿼리를 추가로 연습하고 탐색하기 시작했습니다. SQLAlchemy를 사용하여 데이터베이스 최적화를 수행합니다. 여기서는 Mysql 데이터베이스를 예로 들어보겠습니다.

    SQLAlchemy를 사용하려면 데이터베이스 + 드라이버 패키지의 두 가지 구성 요소를 설치해야 합니다. Flask-SQLAlchemy + PyMySQL을 설치하면 개발이 더 간단하고 편리해집니다.

    데이터베이스 클래스 정의

    모든 Flask 애플리케이션과 플러그인은 App Power에 등록하고 객체를 사용해 동작해야 합니다. 먼저 데이터베이스 작업을 위한 기본 클래스를 정의하고 다른 모듈을 Base에 등록하도록 합니다.

    모든 DB의 공개 메소드는 Base에 기록되어 바퀴를 재발명하는 프로세스를 줄입니다.

    Base에서 SQLAlchemy 인스턴스화

    from flask_sqlalchemy import SQLAlchemy
    db = SQLAlchemy()
    class Base(db.Model):
        # 忽略基类的主键
        __abstract__ = True
    로그인 후 복사

    일반 데이터 클래스는 Base 클래스를 상속하고 User 클래스를 예로 들어 사용하기 전에 db 패키지를 소개합니다.

    from app.models.base import Base
    class User(Base):
        __tablename__ = 'user'
        id = Column(Integer, primary_key=True, autoincrement=True)
        name = Column(String(50), nullable=False, default="")
        email = Column(String(120), nullable=False, default="")
        _password = Column('password',String(64))
        @property
        def password(self):
            return self._password
        @password.setter
        def password(self, raw):
            self._password = generate_password_hash(raw)
    로그인 후 복사

    항목 파일이 DB를 로드합니다

    데이터를 로드할 때 로드해야 합니다. 데이터베이스 초기화 구성에서는 < code>SQLALCHEMY_DATABASE_URI가 지정되고 지정된 형식을 사용합니다. SQLALCHEMY_DATABASE_URI指定,有指定的格式。

    SQLALCHEMY_DATABASE_URI = &#39;mysql+pymysql://root:123456@127.0.0.1:3306/admin?charset=utf8&#39;
    로그인 후 복사

    SQLALCHEMY_DATABASE_URI =数据库+驱动名称://用户名:密码@ip地址:端口号/数据库名称

    def create_app():
        app = Flask(__name__)
        app.config.from_object(&#39;app.config.secure&#39;)
        # 初始化数据库
        db.init_app(app)
        with app.app_context():
            db.create_all()
        return app
    로그인 후 복사

    说明和解释一下with关键字的作用,在python中主要使用的是栈数据结构来运行App实例,with关键字能很好的区分上下文,当资源断开时会自动释放和回收,对程序能启到优化的作用。

    mysql的驱动可以使用cymysql,也可以使用pymysql,网上使用pymysql的教程会偏多一点,使用驱动时,如果拿不定主意去github上使用stat数多的插件,选大众型的,这样解决方案也会多一点。

    模块中定义方法

    model中可以定义模型,常量,直接操作数据库的原子方法,也可以使用db.session的形式来读取数据。

    from sqlalchemy import Column, Integer, String, SmallInteger
    from app.models.base import Base, db
    class tp_manager(Base):
        STATUS_NORMAL = 1
        STATUS_STOP = 0
        # ...
        @classmethod
        def get_manager_by_name(cls, username):
            r = cls.query.filter(cls.username == username, cls.status == cls.STATUS_NORMAL).one()
            return r
        @classmethod
        def get_db(cls):
            r = db.session.query(cls).filter(cls.status == cls.STATUS_NORMAL).all()
            return r
    로그인 후 복사

    在路由中的使用

    在路由中使用时,需要引入models中对应的model包,下面是一个简单使用的Demo,用户的权限可以使用falsk-login组件来存储用户信息。

    from flask import request, session, jsonify
    from app.libs.BaseRoutes import BaseRoutes
    from app.validators.form.login import LoginForm
    from app.models.admin.tp_manager import tp_manager
    api = BaseRoutes(&#39;login&#39;)
    @api.route(&#39;/login/loginHandle&#39;, methods=[&#39;POST&#39;])
    def loginHandle():
        form = LoginForm(request.form)
        if form.validate():
            # 验证通过的逻辑
            r = tp_manager.get_manager_by_name(form.username.data)
            if r:
                msg = &#39;操作成功&#39;
                session[&#39;manager_id&#39;] = r.id
            else:
                msg = &#39;账号和密码错误&#39;
            return jsonify({"code": 200, "data": [], "msg": msg})
        else:
            # 错误暂时忽略...
            return form.errors
    로그인 후 복사

    顺便写一句,flask在使用session前,在配置文件中需要配置SECRET_KEY,不然会报错,key值自定义即可。

    SECRET_KEY = &#39;需要加密的key值&#39;
    로그인 후 복사

    SQLAlchemy实现mysql编码、列类型

    在SQLAlchemy 对Mysql实现了基本操作以后,我发现设置出来的默认值没有生效,字符集编码也被设置成了默认的latin1,优化Mysql的列类型,实现Mysql连接池、接入mongo、redis等NoSql数据库成了下一步要研究的问题。

    默认值和索引设置

    python源码包里的解释很清晰 还附带了例子 ,在Column中是这样设置的:

    Column(Integer, index=True, nullable=False,  server_default="0",comment="昵称")
    로그인 후 복사

    server_default Orm设置初始化Mysql的值,unique指定的是否为唯一索引,default是在SQLAlchemy进行CURD操作时进行的默认值,server_defauldefault的值必须是字符串类型的。

    index是设置索引,nullable设置是否为空,comment设置的是备注信息。

    兼容Mysql列类型

    但是摆在眼前一个问题,你想使用tinyint类型,字符集怎么设置?

    from sqlalchemy.dialects.mysql import VARCHAR, TEXT, BIGINT, INTEGER, SMALLINT, TINYINT, DECIMAL, FLOAT, \
        DOUBLE, DATETIME, TIMESTAMP, DECIMAL
    로그인 후 복사

    以使用最多的int和varchar为例,使用之前要导入对应的包:

    from sqlalchemy import Column, Index, Integer
    from sqlalchemy.dialects.mysql import VARCHAR, TEXT, BIGINT, INTEGER, SMALLINT, TINYINT, DECIMAL, FLOAT, \
        DOUBLE, DATETIME, TIMESTAMP, DECIMAL
    from app.models.base import Base, db
    class wm_user_user(Base):
        STATUS_NORMAL = 1
        __tablename__ = &#39;wm_user_user&#39;
        user_status = Column(TINYINT(display_width=1,unsigned=True), nullable=False, server_default="1",
                             comment="1为正常,0为审核中")
        user_nickname = Column(VARCHAR(length=50), index=True, nullable=False, comment="昵称")
        # 添加配置设置编码
        __table_args__ = {
            &#39;mysql_charset&#39;: &#39;utf8mb4&#39;,
            &#39;mysql_collate&#39;: &#39;utf8mb4_general_ci&#39;
        }
    로그인 후 복사

    TINYINT类型中有三个参数:

    display_width 设置的是列类型宽度,设置完以后会显示tinyint(1)

    """Construct a TINYINT.
    :param display_width: Optional, maximum display width for this number.
    :param unsigned: a boolean, optional.
    :param zerofill: Optional. If true, values will be stored as strings
      left-padded with zeros. Note that this does not effect the values
      returned by the underlying database API, which continue to be
      numeric.
    """
    로그인 후 복사

    SQLALCHEMY_DATABASE_URI =데이터베이스 + 드라이버 이름://사용자 이름:비밀번호@ip 주소:포트 번호/데이터베이스 이름

    __tablename__ = &#39;wm_user_user&#39;
    # ...
    __table_args__ = {
        &#39;mysql_charset&#39;: &#39;utf8mb4&#39;,
        &#39;mysql_collate&#39;: &#39;utf8mb4_general_ci&#39;
    }
    로그인 후 복사
    로그인 후 복사

    파이썬에서 주로 사용하는 with 키워드의 기능을 설명하고 설명합니다. 스택 데이터 구조는 App 인스턴스를 실행하는 데 사용됩니다. with 키워드는 리소스 연결이 끊어지면 자동으로 해제되고 재활용되므로 프로그램을 최적화할 수 있습니다. 🎜🎜Mysql 드라이버는 cymysql 또는 pymysql을 사용할 수 있습니다. 드라이버를 사용할 때 결정하지 못한 경우에는 github로 이동하여 많은 통계 번호가 있는 플러그인을 선택하세요. . 이것이 해결책입니다. 🎜🎜모듈🎜🎜model에 정의된 메소드는 데이터베이스를 직접 동작시키는 모델, 상수, Atomic 메소드를 정의할 수 있으며 db.session 형식을 사용하여 데이터를 읽을 수도 있습니다. 🎜rrreee🎜라우팅에 사용🎜🎜라우팅에 사용할 경우 모델에 해당 모델 패키지를 도입해야 합니다. 다음은 사용자 권한이 falsk-login 구성 요소를 사용하여 사용자 정보를 저장할 수 있다는 것입니다. 🎜rrreee🎜그나저나, 플라스크가 세션을 사용하기 전에 구성 파일에서 SECRET_KEY를 구성해야 합니다. 그렇지 않으면 오류가 보고됩니다. 키 값을 사용자 정의하면 됩니다. 🎜rrreee🎜SQLAlchemy는 mysql 인코딩과 컬럼 유형을 구현합니다🎜🎜SQLAlchemy가 Mysql에서 기본 연산을 구현한 후, 설정된 기본값이 적용되지 않고 문자 집합 인코딩도 기본 latin1</code로 설정되어 있는 것을 발견했습니다. > , Mysql의 컬럼 유형 최적화, Mysql 연결 풀 구현, mongo 및 redis와 같은 NoSql 데이터베이스에 액세스하는 것은 다음 단계에서 연구할 문제가 되었습니다. 🎜🎜기본값 및 인덱스 설정🎜🎜파이썬 소스 코드 패키지의 설명은 매우 명확하며 <code>Column에서는 다음과 같이 설정됩니다: 🎜rrreee🎜server_default</code > Orm 설정 MySQL의 값을 초기화합니다. 고유 인덱스인지 여부를 지정합니다. <code>default는 SQLAlchemy가 CURD 작업을 수행할 때 기본값입니다. /code> 값은 문자열 유형이어야 합니다. 🎜🎜index는 인덱스를 설정하는 것이고, nullable은 비어 있는지 여부를 설정하는 것이고, comment는 주석 정보를 설정하는 것입니다. 🎜🎜Mysql 컬럼 타입과 호환🎜🎜그런데 Tinyint 타입을 사용하려면 문자셋을 어떻게 설정해야 하는지 의문이 듭니다. 🎜rrreee🎜가장 일반적으로 사용되는 int 및 varchar를 사용하기 전에 해당 패키지를 가져와야 합니다. 🎜rrreee🎜TINYINT 유형에는 세 가지 매개변수가 있습니다. 🎜🎜display_width는 열 유형 너비를 설정합니다. tinyint가 표시됩니다(1), 두 번째 부호 없는 값이 양수 범위인지, 세 번째 제로필이 채워졌는지, 값이 숫자 유형인지, 다음은 TINYINT의 소스 코드 사용 지침입니다. 🎜rrreee🎜 varchar를 코드로 하여 스트링 타입에 대해 간단히 소개하자면, 스트링 타입은 문자열 길이를 명시적으로 선언해야 하는데, 길이 값을 추가하지 않으면 초기화 시 오류가 발생합니다. 🎜

    自定义数据库名和字符集编码

    __tablename__设置的是自定义数据表名,底下的设置的是数据表字符集编码,要使用utf8mb4编码和utf8mb4_general_ci编码,这里就不做过多的解释了。

    __tablename__ = &#39;wm_user_user&#39;
    # ...
    __table_args__ = {
        &#39;mysql_charset&#39;: &#39;utf8mb4&#39;,
        &#39;mysql_collate&#39;: &#39;utf8mb4_general_ci&#39;
    }
    로그인 후 복사
    로그인 후 복사

    위 내용은 Flask Blueprint 및 SQLAlchemy를 사용하여 Python 애플리케이션을 작성하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    관련 라벨:
    원천:yisu.com
    본 웹사이트의 성명
    본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
    인기 튜토리얼
    더>
    최신 다운로드
    더>
    웹 효과
    웹사이트 소스 코드
    웹사이트 자료
    프론트엔드 템플릿