快速建站框架Flask的特点 简单使用

鳄鱼君

发表文章数:615

热门标签

,

Vieu四代商业主题

高扩展、安全、稳定、响应式布局多功能模板。

¥69 现在购买
首页 » Python » 快速建站框架Flask的特点 简单使用

Flask是一个面向简单需求和小型应用的微框架。Flask框架具有以下特点:

  1. 内置开发服务器和调试器:Flask自带的开发服务器使开发者在调试程序的时候不需要安装其它网络服务器,例如Apache等。Flask默认处于调试状态,运行中出错都会同时向Python Console和HTTP客户端发送错误信息!
  2. 和Python单元测试功能无缝衔接:Flask提供了一个与Python自带的单元测试框架unitest无缝衔接的测试接口。通过test_client()函数,测试程序可以模拟进行HTTP客户端访问来调用Flask路由处理函数,并获取函数的输出来进行自定义验证!
  3. 使用Jinja2模板:Jinja2从Django模板发展而来,但是比Django模板更自由、更高效。Jinja2模板使用配置的语义系统,提供灵活的模板继承,自动抗击XSS跨站攻击!
  4. 完全兼容WSGI 1.0标准:由于Python线程全局锁的存在,使得WSGI的这个特性至关重要。WSGI位于Web应用程序与Web服务器之间,与WSGI完全兼容使得Flask能够配置到各种大型网络服务器中。
  5. 基于Unicode编码:HTTP本身是基于字节的,也就是说任何编码格式都可以在HTTP中传输。但是,HTTP要求在HTTP Head中显式地声明在本次传输中所应用的编码格式。在默认情况下,Flask会自动添加一个UTF-8编码格式的HTTP Head,我们不需要担心编码问题。

Flask安装

Flask本身是一个微框架,要开发一个完整的Web程序,通常需要安装其它组件。SQLAlchemy和WTForm分别可以为Flask应用提供数据库访问及表单封装功能。flask-wtf是对WTForm实现的一个简单封装包,在它的安装过程中会自动安装WTForm。

pip install flask sqlalchemy flask-wtf -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

Falsk使用

写一个简单的Flask程序

from flask import Flask
# 建立一个app实例
app = Flask(__name__)
# 直接运行程序,__name__的值为__main__
# 当作模块导入,__name__的值为该模块的名称


@app.route('/')
def hello_flask():
    # 返回内容可以是字符串,HTML,XML,JSON
    return 'Hello World! \n This is your first page'


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

运行程序,在浏览器输入:http://127.0.0.1:5000/,你会看到返回的字符串。Flask启动默认是处于调试模式,这个模式下,如果出现错误会直接返回在本地客户端,外部的客户端是不能看到错误信息的。当确定系统可以接受来自外部的访问,可以修改run()方法的参数,让它更像一个真实的网站

# 监听所有地址的80端口,关闭调试模式
app.run(host='0.0.0.', port=80, debug=False) 

模板渲染

模板渲染通过Flask包的render_template方法实现。通过把要加载的模板文件和参数传给该方法,就可以实现HTML的自动渲染。

from flask import Flask
from flask import render_template

app = Flask(__name__)


# 一个函数可以通过多个route装饰器绑定到多个URL上
@app.route('/index')
@app.route('/index/<name>')
def hello_flask(name=None):
    # 渲染hello.html模板,将name传给该模板
    # 没有路径,flask默认回到templates文件夹下寻找
    return render_template('hello.html', name=name)


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

hello.html文件

<strong>This is your page</strong>
{% if name%}    <!-判断name参数是否为空-->
<strong>hello {{ name }}</strong>         <!-不为空,打印改行-->
{% else %}   
<strong>hello world</strong>     <!-为空,打印改行-->
{% endif %}

模板文件必须放在templates文件夹下,flask默认会到templates文件夹下寻找。访问:http://127.0.0.1:5000/index/eyujun

转换变量中的特殊字符

以下代码会在hello页面中显示hi <bink>eyujun</bink>,后者标签没有被HTML转义:

from flask import Flask
from flask import render_template
from flask import Markup

app = Flask(__name__)


@app.route('/')
def hello_flask():
    # 渲染hello.html模板,将name传给该模板
    # 没有路径,flask默认回到templates文件夹下寻找
    return render_template('hello.html', name=Markup('<strong>hi %s </strong>') % '<bink>eyujun</bink>')


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

重定向和错误处理

from flask import Flask
from flask import render_template
from flask import abort, redirect

app = Flask(__name__)


@app.route('/')
def hello_flask():
    return redirect('/check')   # 重定向到/check页面


@app.route('/check')
def hello_check():
    abort(400)           # 向客户端返回400错误,后面的代码都不会执行


# 添加自定义错误处理器
# 程序返回400错误,会执行该函数,并传递自定义错误页面
@app.errorhandler(400)
def hello_bad(error):
    return render_template('error_request.html'), 400


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

URL路由

路径中添加变量

from flask import Flask

app = Flask(__name__)


# route装饰的函数中声明变量,在URL路由中,两次变量需名称一直
# 访问http://127.0.0.1:5000/login/eyujun
@app.route('/login/<username>')
def hello_flask(username):
    return 'hi %s' % username


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

指定变量的类型:

from flask import Flask

app = Flask(__name__)


# route装饰的函数中声明变量,在URL路由中,两次变量需名称一直
# 访问http://127.0.0.1:5000/num/3
@app.route('/num/<int:number>')
def hello_flask(number):
    return 'hi %s' % number


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

不指定类型,默认为path类型。Flask允许3中类型的变量映射

  1. int:整型数值变量
  2. float:浮点型数值变量
  3. path:默认方式,路径字符串

路径最后的分隔符作用

在URL路径中,/被用作路径分隔符。写在开头,绝对路径;写在中间,隔离路径的层级;写在最后,具体通过代码看效果:

from flask import Flask

app = Flask(__name__)


# http://127.0.0.1:5000/index/ 可以访问
# http://127.0.0.1:5000/index 可以访问
@app.route('/index/')
def index_flask():
    return 'this is index page'


# http://127.0.0.1:5000/home 可以访问
# http://127.0.0.1:5000/home/ 不可以访问
@app.route('/home')
def home_flask():
    return 'this is home page'


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

指定HTTP访问的方法

不同的请求交给不同的函数处理,这里记得每个判断都需要由return返回值:

from flask import Flask
from flask import request
app = Flask(__name__)


@app.route('/index', methods=['GET', 'POST'])
def index_flask():
    if request.method == 'POST':
        return do_post()
    elif request.method == 'GET':
        return do_get()
    else:
        return '404 not found'


@app.route('/index', methods=['POST'])
def do_post():
    return 'this is for post methods'


@app.route('/index', methods=['GET'])
def do_get():
    return 'this is for get methods'


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

路由地址反向生成
通过函数名获得其绑定的URL地址

from flask import Flask, url_for
app = Flask(__name__)


@app.route('/')
def e_index(): pass


@app.route('/home')
def e_home(): pass


@app.route('/book/<book_name>')
def e_page(book_name): pass


with app.test_request_context():
    # /
    print(url_for('e_index'))
    # /home
    print(url_for('e_home'))
    # /home?name=eyujun
    print(url_for('e_home', name='eyujun'))
    # /book/hello%20python
    print(url_for('e_page', book_name='hello python'))
if __name__ == '__main__':
    app.run()

未经允许不得转载:作者:鳄鱼君, 转载或复制请以 超链接形式 并注明出处 鳄鱼君
原文地址:《快速建站框架Flask的特点 简单使用》 发布于2020-07-16

分享到:
赞(0) 赏杯咖啡

评论 抢沙发

4 + 9 =


文章对你有帮助可赏作者一杯咖啡

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.6主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册