Flask入门笔记

基本介绍

Flask是python的一个轻量级web框架(相对与Django),轻量体现在它很多功能需要安装第三方插件实现,且其项目的目录结构没有严格的要求。最小的一个flask应用仅仅需要六、七行代码即可搭建出一个网站,不用过多的配置,一个python文件就可以实现。

快速入门

安装flask包

1
pip install flask

一个最基本的flak应用代码如下:

1
2
3
4
5
6
7
from flask import Flask
app = Flask(__name__)#实例化
@app.route("/")#路由
def index():#视图函数
return "hello"
if __name__ == '__main__':
app.run()#运行服务

以上代码运行后即可在http://127.0.0.1:5000/访问。

基本概念

动态路由

url中包含变量,定义路由时使用<>

1
2
3
4
5
6
7
from flask import Flask
app = Flask(__name__)
@app.route('/user/<name>')
def user(name):
return '<h1>Hello, %s!</h1>' % name
if __name__ == '__main__':
app.run(debug=True)

全局变量

  • current_app:当前程序实例
  • g:处理请求时用作临时存储的对象。每次请求都会重设这个变量
  • request:请求对象,封装了客户端发出的 HTTP 请求中的内容
  • session:户会话,用于存储请求之间需要“记住”的值的词典

    响应

    重定向:

    1
    2
    3
    4
    from flask import redirect
    @app.route('/')
    def index():
    return redirect('http://www.example.com')

处理404

1
2
3
4
5
6
7
from flask import abort
@app.route('/user/<id>')
def get_user(id):
user = load_user(id)
if not user:
abort(404)
return '<h1>Hello, %s</h1>' % user.name

模版

模版就是定义好静态网页,通过服务器去渲染网页使之成为动态网页。

渲染模版

如有以下程序:

1
2
3
4
5
6
7
from flask import Flask, render_template
@app.route('/')
def index():
return render_template('index.html')
@app.route('/user/<name>')
def user(name):
return render_template('user.html', name=name)

  • 模版的默认目录在templates目录下(需自己创建),即index.html放在templates目录下
  • 使用render_template()方法渲染网页
  • name为传递参数,可以是对象、字典等
  • 在模版文件中使用取传递的值

    控制结构

    模版文件(html)中使用控制结构如下:
    if
    1
    2
    3
    4
    5
    {% if user %}
    Hello, {{ user }}!
    {% else %}
    Hello, Stranger!
    {% endif %}

for

1
2
3
4
<ul>
{% for comment in comments %}
<li>{{ comment }}</li> {% endfor %}
</ul>

模版继承
base.html内容:

1
2
3
4
5
6
7
8
9
<html>
<head>
{% block head %}
<title>{% block title %}{% endblock %} - My Application</title> {% endblock %}
</head>
<body>
{% block body %}
{% endblock %} </body>
</html>

继承base.html

1
2
3
4
5
6
7
{% extends "base.html" %}
{% block title %}Index{% endblock %} {% block head %}
{{ super() }}
<style>
</style>
{% endblock %}
{% block body %} <h1>Hello, World!</h1> {% endblock %}

也就是使用这种方式继承时,block名称相同的地方的内容会被替换。

自定义错误页

1
2
3
4
5
6
@app.errorhandler(404)
def page_not_found(e):
return render_template('404.html'), 404
@app.errorhandler(500)
def internal_server_error(e):
return render_template('500.html'), 500

引用静态文件

如css,js,图片等
⚠️flask默认会在static找静态文件
如引用图标

1
2
<link rel="shortcut icon" href="{{ url_for('static', filename = 'favicon.ico') }}"
type="image/x-icon">

url_for()

url_ for(‘index’)得到的结果是/。调用url_for(‘index’, _external=True)返回的则是绝对地 址,在这个示例中是 http://localhost:5000/。
此外,还可以加上参数如:url_ for(‘index’,name=”name”),如果变量为动态参数则会得到/name,否则为/?name=”name”。

Web表单

使用flask_wtf插件

一、定义表单类,继承自FlaskForm

1
2
3
4
5
6
7
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField, PasswordField
from wtforms.validators import DataRequired
class NameForm(FlaskForm):
name = StringField("姓名:",validators=[DataRequired()])
pwd = PasswordField("密码:")
submit = SubmitField("提交")

其中validators为校验方式,DataRequired()为不能为空值

二、定义密钥(必须)

字符串随意,key固定

1
app.config['SECRET_KEY'] = "sj1jk4d2ndj4452kjjksefop"

三、在模版中使用表单类

1
2
3
4
5
6
<form method="post">
{{ form.hidden_tag() }}
{{ form.name.label }} {{ form.name }}
{{ form.pwd.label }} {{ form.pwd }}
{{ form.submit() }}
</form>

其中hidden_tag必要,用来存密钥

四、处理提交表单

1
2
3
4
5
6
7
8
@app.route('/',methods=['GET','POST'])
def index():
name = None
form = NameForm()
if form.validate_on_submit():
name = form.name.data
pwd = form.pwd.data
return render_template("index.html",form=form,name=name)

此处获取表单提交的值也可用request对象获取如:request.form.get(‘name’)

闪现消息

  • 在逻辑处理中,使用函数flash("用户名或密码错误")
  • 在模版中使用以下代码显示:
    1
    2
    3
    {% for message in get_flashed_messages() %}
    {{ message }}
    {% endfor %}

连接数据库

使用flask_sqlalchemy插件

定义数据模型类

1
2
3
4
5
6
7
8
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
def init_db(app):
db.init_app(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True,autoincrement=True)
username = db.Column(db.String(80))
password = db.Column(db.String(120))

其中,因为初始化数据库需在应用实例化以后,所以使用db.init_app(app)这种方式来实例化数据库,使得可以在应用创建后调用函数来实例化数据库。

配置数据库参数

1
2
3
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
init_db(app)

不同数据库仅地址不一样,其它一致

建表

1
db.create_all()

插值

1
2
3
4
5
u = User()
u.username = "wsr"
u.password = "123"
db.session.add(u)
db.session.commit()

查询

查询第一个,返回结果为对象

1
u = User.query.filter_by(username=name).first()

如果查询所有为.all()

其它扩展

Flask-Script

使用命令行启动网站,并且可以传入地址,端口等参数,设置如下:

1
2
3
4
5
from flask_script import Manager
app = Flask(__name__)
manager = Manager(app)
if __name__ == '__main__':
manager.run()

命令行操作:

1
python hello.py runserver --host 0.0.0.0

允许所有计算机访问。

Flask-Bootstrap

1
2
3
from flask_bootstrap import Bootstrap
app = Flask(__name__)
bootstrap = Bootstrap(app)

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 jaytp@qq.com

文章标题:Flask入门笔记

本文作者:子非鱼

发布时间:2019-01-05, 14:42:59

最后更新:2019-01-06, 21:12:30

原始链接:https://Wangsr.cn/2019/01/05/Flask入门笔记/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏