安装
–创建虚拟环境
python -m venv venv
激活虚拟环境
venv\Scripts\activate
进入虚拟环境后安装Flask
pip install Flask
测试是否安装成功,运行以下代码
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World'
if __name__ == '__main__':
app.run()
模板
–创建模板
要渲染一个模板,通过render_template
方法即可,以下将用一个简单的例子进行讲解:
首先在项目根目录创建templates
文件夹,并创建index.html文件
from flask import Flask,render_template
app = Flask(__name__)
@app.route('/about/')
def about():
return render_template('index.html')
这样就能加载html里的内容了
–模板语法
所有的控制语句都是放在{% ... %}
if语句和python
中的类似,可以使用>,<,<=,>=,==,!=
来进行判断,也可以通过and,or,not,()
来进行逻辑合并操作,以下看例子:
from flask import Flask,render_template
app = Flask(__name__)
@app.route('/')
def index():
list=[1,2,3,4,5,6]
return render_template('index.html',list=list)
if __name__ == '__main__':
app.run(debug = True)
前端代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
{% for user in list %}
{{ user }}
{% endfor %}
</body>
</html>
–模板继承
在实际开发中,我们会遇到网站的顶部和尾部保持不变,那么我们可以模板继承,如图
首先我们需要创建一个副模板base.html
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" href="base.css" />
<title>
{% block title %}
<!--titie部分-->
{% endblock %}
</title>
{% block head %}
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.staticfile.org/twitter-bootstrap/5.1.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.staticfile.org/twitter-bootstrap/5.1.1/js/bootstrap.bundle.min.js"></script>
{% endblock %}
</head>
{% block navbar %}
<nav class="navbar navbar-expand-sm bg-light">
<!-- Links -->
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" href="#">首页</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">登录</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">退出</a>
</li>
</ul>
</nav>
{% endblock %}
<body>
<div id="body">{% block body %}{% endblock %}</div>
<div id="footer">
{% block footer %}
<nav class="navbar navbar-expand-sm bg-light">
<!-- Links -->
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" href="#">底部</a>
</li>
</ul>
</nav>
{% endblock %}
</div>
</body>
</html>
创建子模板index.html,去继承base.html里的顶部部分head部分和底部部分,head部分为引用的css样式
那么问题来了,如何引用?
block语法引用,
{% extends "base.html" %}
{% block title %}首页{% endblock %}
{% block body %}
我是body部分
{% endblock %}
静态文件的使用
Web
应用中会出现大量的静态文件来使得网页更加生动美观。类似于CSS
样式文件、JavaScript
脚本文件、图片文件、字体文件等静态资源。在Jinja
中加载静态文件非常简单,只需要通过url_for
全局函数就可以实现,看以下代码:
<link href="{{ url_for('static',filename='about.css') }}">
配置数据库
安装相关模块
首先安装pymysql
pip install pymysql
安装SQLAlchemy
SQLAlchemy
是一个数据库的ORM
框架,让我们操作数据库的时候不要再用SQL
语句了,跟直接操作模型一样。
pip install SQLAlchemy
安装Flask-Migrate插件(类似djiango里的ORM模型)
pip install flask-migrate
修改文件
创建config.py,将数据库配置放进去
# 数据库的配置变量
HOSTNAME = 'ip'
PORT = '3306'#端口
DATABASE = ''#表名
USERNAME = ''#用户名
PASSWORD = 'm2zjPnyb5aa5X3Zd'#密码
DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(USERNAME,PASSWORD,HOSTNAME,PORT,DATABASE)
SQLALCHEMY_DATABASE_URI = DB_URI
SQLALCHEMY_TRACK_MODIFICATIONS = True
创建ext.py文件
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
创建模型(ORM)类,比如创建一个models.py文件,将数据库配置文件放进去
from ext import db
#创建一个user表
class User(db.Model):
#id自增
id = db.Column(db.Integer,primary_key=True)
user = db.Column(db.String(20))
pwd = db.Column(db.String(20))
在主文件中这样配置
from flask import Flask,render_template
from flask_migrate import Migrate
import config
from ext import db
from models import User
app = Flask(__name__)
#加载配置文件
app.config.from_object(config)
#把app绑定db
db.init_app(app)
# 绑定app和数据库
migrate = Migrate(app,db)
@app.route('/')
def hello_world():
return 'Hello World'
if __name__ == '__main__':
app.run()
迁移文件
之后,就可以在命令行中映射ORM
了。首先需要初始化一个迁移文件夹:
flask db init
然后再把当前的模型添加到迁移文件中:
flask db migrate
最后再把迁移文件中对应的数据库操作,真正的映射到数据库中:
flask db upgrade
from ext import db
import datetime
#创建一个user表
class User(db.Model):
#id自增
id = db.Column(db.Integer,primary_key=True)
user = db.Column(db.String(20))
pwd = db.Column(db.String(20))
#更新时间
update_at = db.Column(db.DateTime, default=datetime.datetime.now, onupdate=datetime.datetime.now)
蓝图
创建蓝图文件
比如我们要创建登录页面蓝图,首先创建login/login.py文件
创建完成后写入以下内容
from flask import Blueprint
blueprint = Blueprint('login', __name__, url_prefix='/login')
@blueprint.route("/")
def login():
return "登录模块"
app文件注册蓝图
app.register_blueprint(login.blueprint)
完整代码
from flask import Flask,render_template
from flask_migrate import Migrate
import config
from ext import db
from login import login
app = Flask(__name__)
#加载配置文件
app.config.from_object(config)
#把app绑定db
db.init_app(app)
# 绑定app和数据库
migrate = Migrate(app,db)
#注册蓝图
app.register_blueprint(login.blueprint)
if __name__ == '__main__':
app.run()
访问路径
http://127.0.0.1:5000/login/
Session登录实例
定义SECRET_KEY
首先在config.py中设置SECRET_KEY
# 数据库的配置变量
HOSTNAME = 'ip'
PORT = '3306'#端口
DATABASE = ''#表名
USERNAME = ''#用户名
PASSWORD = 'm2zjPnyb5aa5X3Zd'#密码
DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(USERNAME,PASSWORD,HOSTNAME,PORT,DATABASE)
SQLALCHEMY_DATABASE_URI = DB_URI
SQLALCHEMY_TRACK_MODIFICATIONS = True
SECRET_KEY = 'dfggfjyjukkjknihinbuhmjbnhhgujj'
编写login视图
在login/login.py中这样写
from flask import Blueprint
from flask import render_template, request,session
blueprint = Blueprint('login', __name__, url_prefix='/login')
#登录视图
@blueprint.route("/")
def login():
return render_template('login/login.html')
#登录请求
@blueprint.route("/api", methods = ['GET', 'POST'])
def login_api():
if request.method == 'POST':
session['username'] = request.form['username']
return "登录成功,你的用户名是:{}".format(session['username'])
return render_template('login/login.html')
创建login模板
在templates 文件夹新增login/login.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>登录页面</title>
</head>
<body>
<form action = "/login/api" method = "post">
<p><input type="text" name="username"/></p>
<p><input type="submit" value ="登录"/></p>
</form>
</body>
</html>
暂无评论内容