python3 -V && pip3 -V pip3 install 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')
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"
웹 라우팅을 완료한 후 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)
데이터를 로드할 때 로드해야 합니다. 데이터베이스 초기화 구성에서는 < code>SQLALCHEMY_DATABASE_URI가 지정되고 지정된 형식을 사용합니다. SQLALCHEMY_DATABASE_URI
指定,有指定的格式。
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:123456@127.0.0.1:3306/admin?charset=utf8'
SQLALCHEMY_DATABASE_URI =
数据库+驱动名称://用户名:密码@ip地址:端口号/数据库名称
def create_app(): app = Flask(__name__) app.config.from_object('app.config.secure') # 初始化数据库 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('login') @api.route('/login/loginHandle', methods=['POST']) def loginHandle(): form = LoginForm(request.form) if form.validate(): # 验证通过的逻辑 r = tp_manager.get_manager_by_name(form.username.data) if r: msg = '操作成功' session['manager_id'] = r.id else: msg = '账号和密码错误' return jsonify({"code": 200, "data": [], "msg": msg}) else: # 错误暂时忽略... return form.errors
顺便写一句,flask在使用session前,在配置文件中需要配置SECRET_KEY
,不然会报错,key值自定义即可。
SECRET_KEY = '需要加密的key值'
在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_defaul
和default
的值必须是字符串类型的。
index
是设置索引,nullable
设置是否为空,comment
设置的是备注信息。
但是摆在眼前一个问题,你想使用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__ = 'wm_user_user' 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__ = { 'mysql_charset': 'utf8mb4', 'mysql_collate': 'utf8mb4_general_ci' }
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__ = 'wm_user_user' # ... __table_args__ = { 'mysql_charset': 'utf8mb4', 'mysql_collate': 'utf8mb4_general_ci' }
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__ = 'wm_user_user' # ... __table_args__ = { 'mysql_charset': 'utf8mb4', 'mysql_collate': 'utf8mb4_general_ci' }
위 내용은 Flask Blueprint 및 SQLAlchemy를 사용하여 Python 애플리케이션을 작성하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!