Flask从入门到精通Flask从入门到精通

Flask从入门到精通Flask从入门到精通

Flask教程

安装

–创建虚拟环境

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文件

图片[1]-Flask从入门到精通Flask从入门到精通-青柠博客

创建完成后写入以下内容

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>

最终结果演示

图片[2]-Flask从入门到精通Flask从入门到精通-青柠博客

© 版权声明
THE END
喜欢就支持一下吧
点赞11赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容