Flask 기반 웹 애플리케이션 탄생에 관한 네 번째 기사입니다. 이 기사에서는 주로 Flask와 mysql을 상호 연결하는 방법을 소개합니다. 관심 있는 친구는
1장의 구현 부분을 참조하세요. 로그인 기능을 부분 기능이라고 부르는 이유는 사용자 이름과 비밀번호를 고정된 값으로 쓰는 것이 절대 허용되지 않기 때문입니다. 전체 기능에는 최소한 등록, 로그인, 비밀번호 수정 등이 필요하며 이를 제공해야 합니다. a 이러한 값을 데이터베이스에 저장하는 기능.
현재 주류 데이터베이스는 관계형 데이터베이스와 NoSql 데이터베이스라는 두 가지 유형으로 나누어지며, 중소 규모 시스템의 경우 두 데이터베이스의 성능과 사용 편의성이 동일하며 둘 다 좋은 선택입니다. .
기본 구성
여기서는 SQLAlchemy 데이터베이스 프레임워크의 플라스크 통합 패키지, 즉 플라스크-SQLAlchemy를 사용하여 데이터베이스 작업을 수행합니다.
SQLAlchemy는 데이터베이스 작업을 단순화하는 매우 좋은 프레임워크로, 높은 수준의 ORM과 낮은 수준의 SQL 기능을 제공하므로 사용이 매우 편리합니다.
설치 방법은 이전 유형과 동일하거나 pip 명령:
pip3.6 install flask-sqlalchemy
설치가 완료된 후 기본 구성 부분을 수정하고 먼저 패키지를 가져옵니다.
from flask.ext.sqlalchemy import SQLAlchemy
그런 다음 링크 문자열을 구성합니다:
app.config["SQLALCHEMY_DATABASE_URI"]='mysql://root:1234@localhost/cblog'
요청이 완료된 후 변경 사항의 자동 커밋을 구성합니다:
app.config["SQLALCHEMY_COMMIT_ON_TEARDOWN"]=True
SQLAlchemy 인스턴스화:
db=SQLAlchemy(app)
모델 설정
설치가 완료된 후 계속해서 로그인 예제를 개선하고 default.py 파일에 사용자 모델(클래스) 및 역할 모델(연관 표시용)을 추가합니다
역할 클래스
class Role(db.Model): #需继承模型 __tablename__="roles" #db中表明,如果不设置,则会与class同的默认名 id=db.Column(db.Integer,primary_key=True) #SQLAlchemy要求必须有主键,一般命名为id即可 name=db.Column(db.String(50),unique=True) #表示name为字符串,不重复 users=db.relationship("User",backref='role') #关联user模型,并在user中添加反向引用(backref)
사용자 클래스
class User(db.Model): __tablename__="users" id=db.Column(db.Integer,primary_key=True) username=db.Column(db.String(50),unique=True,index=True) #此列带索引 password=db.Column(db.String(50)) role_id=db.Column(db.Integer,db.ForeignKey("roles.id")) #外键指向roles表中的id列
다음은 어떻게 해야 하는지 고려해야 합니다. 실행하기 편리해야 하고 로직 코드를 침범할 수 있는지 여부가 필요합니다. 예를 들어 db 상태를 확인하는 코드는 app.run에 매개변수로 전달됩니다. () 이때 셸이 유용합니다
구성 스크립트
Flask에서 명령줄 스크립트를 지원하려면 먼저 설치해야 합니다. 플라스크 스크립트 확장:
pip3.6 install flask-script
default.py의 코드 수정:
from flask.ext.script import Manager mamager=Manager(app) .... if __name__=='__main__': #app.run(debug=True) mamager.run()
수정 후 다시 실행:
python default.py
성공적으로 실행되지 않은 것을 발견했습니다. 그런데 프롬프트가 있었습니다:
각각 shell(실행 스크립트), runserver(서비스 시작) 및 help 뒤에 매개변수가 필요하다는 것을 알 수 있습니다
아래 서비스 시작:
python default.py runserver
서비스가 성공적으로 실행되었습니다
추가 데이터베이스 구성
그러나 이때 액세스할 때 사이트(127.0.0.1:5000)에서는 mysql 모듈이 없다는 500 오류가 나타납니다. 이유는 무엇입니까? 분명히 그 이유는 pip 명령을 사용하여 드라이버를 설치하기 때문입니다.
pip3.6 install MySQL-python
오류가 발견되었으며 표시되는 내용은 다음과 같습니다(여기서는 win 시스템만 해당):
프롬프트에 따라 C++ 도구 패키지를 설치하고 프롬프트의 다운로드 주소를 따르세요
landinghub.visualstudio.com/visual-cpp-build-tools
다운로드가 완료되면 exe 파일에 바로 들어가고,
을 설치하고 다시 시작하여 MySQL-python을 설치하는 것이 여전히 불가능하다는 것을 Baidu를 통해 확인한 결과 MySQLdb가 발견되었습니다. 라이브러리는 python2.7까지만 지원하고 더 이상 3.x를 지원하지 않습니다. 그러면 다른 방법을 사용해야 합니다. PyMySQL 라이브러리를 사용하세요:
pip3.6 install PyMySQL
그런 다음 default.py의 코드를 수정하고 두 줄을 추가합니다. :
import pymysql pymysql.install_as_MySQLdb()
소스 코드를 입력하고 다음 줄에 주의하세요.
sys.modules["MySQLdb"] = sys.modules["_mysql"] = sys.modules["pymysql"]
는 성공적으로 mysql을 사용하고 연결할 수 있습니다.
브라우저에 연결을 입력하고 사이트에 올바르게 입력하세요.
다음으로 쉘을 사용하여 데이터베이스 테이블을 생성하고 default.py의 루트 디렉터리를 입력합니다.
python default.py shell from default import db db.create_all()
이번에 오류가 보고되지 않으면, :
데이터베이스 마이그레이션
이때 문제가 발생합니다. 시간이 지나면 모델을 수정하면 DB에는 반영되지 않는데 수정하면 어떻게 해야 하나요? 현재로서는 매우 간단합니다.
db.drop_all() db.create_all()
하지만 이는 디버깅 중에만 사용됩니다. 이미 DB에 데이터가 있으면 이 시점에서는 확실히 견딜 수 없는 일입니다. 마이그레이션 플러그인 Migrate는 여전히 동일합니다.
pip3.6 install flask-migrate
이전과 마찬가지로 설치 후 구성을 위해 default.py 파일을 수정합니다.
from flask.ext.migrate import Migrate,MigrateCommand migrate=Migrate(app,db) #配置迁移 mamager.add_command("db",MigrateCommand) #配置迁移命令
그런 다음 init 명령을 사용하여 마이그레이션 웨어하우스를 초기화합니다.
python default.py db init
명령줄에 다음이 표시됩니다.
그런 다음 마이그레이션 디렉터리를 추가합니다.
은 마이그레이션 파일 초기화가 완료되었음을 의미합니다.
migrate框架提供了一些命令来进行迁移操作,分别为(使用default.py文件举例):
#根据差异创建迁移 python default.py db migrate -m "说明" #改动差异 python default.py db upgrade #取消差异改动 python default.py db downgrade
回到表单
接下来看看登录如何与数据库关联起来,修改login方法内的代码:
@app.route("/login",methods=["POST"]) def loginPost(): username=request.form.get("username","") password=request.form.get("password","") user=User.query.filter_by(username=username,password=password).first() #数据库查询 if user is not None: session["user"]=username return render_template("/index.html",name=username,site_name='myblog') else: flash("您输入的用户名或密码错误") return render_template("/login.html") #返回的仍为登录页
执行结果非常完美。
一些总结
下面是一些关于python和db相连的总结性的东西
数据类型
列选项
数据库操作
查询过滤器
经过这几章,登录功能已经基本完成,在下一章中将讲解用户注册的相关功能。
위 내용은 플라스크와 mysql(python)을 연결하는 예제에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!