侧边栏壁纸
  • 累计撰写 10 篇文章
  • 累计创建 12 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

flask入门

枳树
2023-01-17 / 0 评论 / 0 点赞 / 395 阅读 / 1,314 字

一.安装flask

通过pip install flask即可安装

二.第一个flask程序

用pycharm新建flask项目

img

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return 'hello,world'

if __name__ == '__main__':
    app.run()

三.项目配置

一. 设置为DEBUG模式

image-20220909103911959

image-20220909103949167

二. 配置文件

创建config.py,通过app.config.from_object(config)导入

四.URL与视图

@app.route("/book/<string:book_id>",methods=['GET'])
def book_detail(book_id):
    for book in books:
        if book_id == str(book['id']):
            return book
    return f"id为{book_id}的图书没找到"

构造URL

book['url'] = url_for("book_detail",book_id=book['id'])

五.指定HTTP方法

image-20220909111456003

六.页面跳转与重定向

@app.route("/profile")
def profile():
    # 查询字符串
    # 1.作为url的组成部分:/book/1
    # 2.查询字符串:/book?id=1
    usr_id = request.args.get("id")
    if usr_id:
        return "用户个人中心"
    else:
        return redirect(url_for("index"))

七.模板简介

from flask import Flask,render_template

app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'hello'

@app.route('/about')
def about():
    return render_template('about.html')

if __name__ == '__main__':
    app.run()
@app.route('/about')
def about():
    context = {
        "username": "zhiliao"
    }
    return render_template('about.html',**context)

jinja2模板过滤器

<h1>我们是知了{{ username | length }}</h1>
<div>{{ books}}</div>
<div>{{ books|join(",") }}</div>

控制语句

<body>
{% if age > 18 %}
    <div>您已成年</div>
{% elif age < 18 %}
    <div>您未成年</div>
{% else %}
    <div>您刚成年</div>
{% endif %}
</body>

八. 蓝图和子域名

from flask import Blueprint

bp = Blueprint("book",__name__,url_prefix="/book")

@bp.route('/list')
def book_list():
    return '图书列表'
from flask import Flask
from apps.book import bp as book_bp


app = Flask(__name__)

app.register_blueprint(book_bp)


@app.route('/')
def hello_world():
    return 'hello'


if __name__ == '__main__':
    app.run()

九. SQLAlchemy ORM使用

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

DB_URI = 'mysql+pymysql://root:999888@127.0.0.1:3306/lflask'

app.config['SQLALCHEMY_DATABASE_URL'] = DB_URI
db = SQLAlchemy(app)

@app.route('/')
def hello_world():
    engine = db.get_engine()
    with engine.connect() as conn:
        result = conn.execute("select 1")
        print(result.fetchone())
    return 'hello'


if __name__ == '__main__':
    app.run()

定义模型和增删改查

定义模型

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__,static_url_path='/')
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:999888@localhost:3306/llflask'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)  # 实例化对象


# 定义ORM模型
class Article(db.Model):
    __tablename__ = "article"
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    title = db.Column('title',db.String(200),nullable=False)
    content = db.Column(db.Text,nullable=False)

db.create_all()

if __name__ == '__main__':
    app.run()

添加一条数据

@app.route('/article')
def article_view():
    article = Article(title="钢铁是怎样炼成的",content="xxx")
    db.session.add(article)
    db.session.commit()
    return "数据操作成功"

查询数据

@app.route('/article')
def article_view():
    # 查询
    article = Article.query.filter_by(id=1)[0]
    print(article.title)
    return "数据操作成功"

修改数据

@app.route('/article')
def article_view():
    # 修改
    article = Article.query.filter_by(id=1)[0]
    article.content = "yyy"
    db.session.commit()
    return "数据操作成功"

删除数据

@app.route('/article')
def article_view():
    # 删除
    Article.query.filter_by(id=1).delete()
    db.session.commit()
    return "数据操作成功"

表关系

    # 添加外键
    author_id = db.Column(db.Integer,db.ForeignKey("user.id"))

    # relationship
    author = db.relationship("User",backref="articles")

Flask-Migrate插件

pip install flask-migrate

from flask_migrate import Migrate

app = Flask(__name__,static_url_path='/')
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:999888@localhost:3306/llflask'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)  # 实例化对象

migrate = Migrate(app,db)

初始化 flask db init

生成迁移脚本 flask db migrate -m "feat: xxx"

迁移 flask db upgrade

项目结构重构

循环引用问题

解决方法

创建exts.py文件

from flask_sqlalchemy import SQLAlchemy


db = SQLAlchemy() 

然后再app和models中引用

app.py

from flask import Flask
from exts import db
from flask_migrate import Migrate
from models import Article,User,UserExtension
import config


app = Flask(__name__,static_url_path='/')
app.config.from_object(config)
# 把app绑定在db上
db.init_app(app)

migrate = Migrate(app,db)

models.py

from exts import db

# 定义ORM模型
class User(db.Model):
    __tablename__ = "user"
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    username = db.Column(db.String(200),nullable=False)

十.cookie和session

from flask import Flask,Response,request,session

app = Flask(__name__)
app.config['SECRET_KEY'] = 'sdkjgfdh36346'

@app.route('/set_cookie')
def set_cookie():
    response = Response("cookie 设置")
    response.set_cookie("user_id","xxx")
    return response

@app.route('/get_cookie')
def get_cookie():
    user_id = request.cookies.get("user_id")
    print("user_id:",user_id)
    return "读取cookie"
@app.route('/set_session')
def set_session():
    session['username'] = 'zhiliao'
    return 'session设置成功'

@app.route("/get_session")
def get_session():
    username = session.get('username')
    print("username",username)
    return "get session"

@app.route('/')
def hello_world():  # put application's code here
    return 'Hello World!'


if __name__ == '__main__':
    app.run()

十一.Flask-WTF表单验证

import wtforms
from wtforms.validators import length,email

class LoginForm(wtforms.Form):
    email = wtforms.StringField(validators=[length(min=5,max=20),email()])
    password = wtforms.StringField(validators=[length(min=6,max=20)])
from flask import Flask,Response,request,session,render_template
from forms import LoginForm
app = Flask(__name__)

@app.route('/login',methods=['GET','POST'])
def login():
    if request.method == 'GET':
        return render_template("login.html")
    else:
        form = LoginForm(request.form)
        if form.validate():
            return "登录成功"
        else:
            return "邮箱或密码错误"

if __name__ == '__main__':
    app.run()
0

评论区