Flask框架web开发:零基础入门
Flask框架是Python开发的一个基于Werkzeug和Jinja 2的web开发微框架,它的优势就是极其简洁,但又非常灵活,而且容易学习和应用。因此Flask框架是Python新手快速开始web开发最好的选择,此外,使用Flask框架的另一个好处在于你可以非常轻松地将基于Python的机器学习算法或数据分析算法集成到web应用中。
如果希望深入学习Flask Web开发,推荐这个教程: 深入浅出Flask
1、可以用Flask框架做什么
从博客应用到克隆一个facebook或者twitter,理论上你可以用Flask做任何事情。有很多库可以直接使用,例如flask-sockets,flask-google-maps等,而且Flask框架支持MySQL、Postgresql、MongoDB等诸多数据库。
我能想到的一些可以用Flask框架实现的web应用类型:博客应用、聊天应用、仪表盘应用、RESTAPI、管理页面、邮件服务等。
安装Flask
使用pip安装Flask:
$ pip install flask
2、Hello,World
创建一个文件app.py,然后只需要几个简单的步骤,就可以写出Flask版本的Hello World
- 引入Flask类
from flask import Flask
- 创建Flask对象,我们将使用该对象进行应用的配置和运行:
app = Flask(__name__)
name 是Python中的特殊变量,如果文件作为主程序执行,那么__name__
变量的值就是__main__
,如果是被其他模块引入,那么__name__
的值就是模块名称。
- 编写主程序
在主程序中,执行run()
来启动应用:
if __name__ =="__main__": app.run(debug=True, port=8080)
改名启动一个本地服务器,默认情况下其地址是localhost:5000
,在上面的代码中,我们使用关键字参数port
将监听端口修改为8080。
- 路由
使用app变量的route()
装饰器来告诉Flask框架URL如何触发我们的视图函数:
@app.route('/') def hello_world(): return 'Hello, World!'
上面的标识,对路径'/'的请求,将转为对hello_world()
函数的调用。很直白,对吧?
- 运行
现在,让我们完整地看一下app.py的整个代码:
from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello, World!' if __name__ =="__main__": app.run(debug=True,port=8080)
然后运行起来:
$ python app.py
你应该会看到如下输入:
* Serving Flask app "app" (lazy loading) * Environment: production * Debug mode: on * Running on http://127.0.0.1:8080/ (Press CTRL+C to quit) * Restarting with stat * Debugger is active! * Debugger PIN: 770-937-705
现在就可以打开浏览器访问http://127.0.0.1:8080/
了:
3、使用HTML模板
首先我们看看如何原始的HTML代码插入Flask应用:
from flask import Flask app = Flask(__name__) @app.route('/greet') def greet(): user = {'username': 'John', 'age': "20"} return ''' <html> <head> <title>Templating</title> </head> <body> <h1>Hello, ''' + user['username'] + '''!, you’re ''' + user['age'] + ''' years old.</h1> </body> </html>''' if __name__ == '__main__': app.run(debug = True,port=8080)
在上面的代码中,我们使用拼接的HTML字符串来展示user字典的数据。现在访问http://127.0.0.1:8080/greet
:
拼接HTML字符串非常容易出错,因此Flask使用Jinja 2模板引擎来分离数据逻辑和展示层。
我们将模板文件按如下路径放置:
Apps folder /app.py templates |-/index.html
使用模板时,视图函数应当返回render_template()
的调用结果。例如下面的代码片段渲染模板index.html
,并将渲染结果作为视图函数的返回值:
from flask import Flask, render_template app = Flask(__name__) @app.route('/hello') def hello(): return render_template('index.html', name="Alex") if __name__ == '__main__': app.run(debug = True)
在上面的代码中,模板文件index.html
依赖于变量name
,其内容如下:
<html> <body> {% if name %} <h2>Hello {{ name }}.</h2> {% else %} <h2>Hello.</h2> {% endif %} </body> </html>
模板文件的语法扩充了HTML,因此可以使用变量和逻辑。
在浏览器中访问http://127.0.0.1:8080/hello/alex
:
4、使用表单
每个web应用都需要使用表单来采集用户数据。现在让我们使用Flask框架创建一个简单的表单来收集用户的基本信息,例如名称、年龄、邮件、兴趣爱好等,我们将这个模板文件命名为bio_form.html
<!DOCTYPE html> <html> <head> <title></title> </head> <body> <h1>Bio Data Form</h1> <form action="showbio"> <label>Username</label> <input type="name" name="username"><br> <label>Email</label> <input type="email" name="email"><br> <label>Hobbies</label> <input type="name" name="hobbies"><br> <input type="submit" name=""> </form> </body> </html>
视图函数bio_data_form
同时支持POST和GET请求。GET请求将渲染bio_form.html
模板,而POST请求将重定向到showbio
:
@app.route('/form', methods=['POST', 'GET']) def bio_data_form(): if request.method == "POST": username = request.form['username'] age = request.form['age'] email = request.form['email'] hobbies = request.form['hobbies'] return redirect(url_for('showbio', username=username, age=age, email=email, hobbies=hobbies)) return render_template("bio_form.html")
下面是showbio的实现:
@app.route('/showbio', methods=['GET']) def showbio(): username = request.args.get('username') age = request.args.get('age') email = request.args.get('email') hobbies = request.args.get('hobbies') return render_template("show_bio.html", username=username, age=age, email=email, hobbies=hobbies)
以及show_bio.html的内容:
<!DOCTYPE html> <html> <head> <title>Bio-Data Details</title> </head> <body> <h1>Bio-Data Details</h1> <hr> <h1>Username: {{ username }}</h1> <h1>Email: {{ email }}</h1> <h1>Hobbies: {{ hobbies }}</h1> </body> </html>
5、数据库集成:使用SQLAlchemy
Flask不能直接连接数据库,需要借助于ORM(Object Relational Mapper)。在这一部分,我们将借助于SQLAlchemy使用Postgres数据库。
- 安装Flask-SQLAlchemy和Postgres
首先安装flask-sqlalchemy:
$ pip install flask-sqlalchemy
然后从官方下载并安装postgres:https://postgresapp.com/
- 创建数据库
在终端中使用下面的命令创建一个appdb数据库:
$ createdb appdb
- 更新应用配置
修改app.config,添加数据库相关的配置信息:
app.config['DEBUG'] = True app.config['SQLALCHEMY_DATABASE_URI']='postgresql://localhost/appdb' SQLALCHEMY_TRACK_MODIFICATIONS = True db = SQLAlchemy(app)
然后在代码中就可以使用这些配置数据了:
from flask import Flask, request, render_template from flask_sqlalchemy import SQLAlchemy # Settings app = Flask(__name__) app.config['DEBUG'] = True app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://localhost/appdb' db = SQLAlchemy(app) @app.route('/') def hello_world(): return 'Hello, World!' if __name__ == '__main__': app.run()
现在,让我们创建第一个模型(Model)。所有模型的基类是db.Model,使用Column来定义数据列:
class Post(db.Model): id = db.Column(db.Integer(), primary_key=True) title = db.Column(db.String(80), unique=True) post_text = db.Column(db.String(255)) def __init__(self, title, post_text): self.title = title self.post_text = post_text
在代码中使用模型:
from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://localhost/testdb' db = SQLAlchemy(app) class Post(db.Model): id = db.Column(db.Integer(), primary_key=True) title = db.Column(db.String(80), unique=True) post_text = db.Column(db.String(255)) def __init__(self, title, post_text): self.title = title self.post_text = post_text @app.route('/') def index(): return "Hello World" app = Flask(__name__) if __name__ == "__main__": app.run()
6、模型-数据同步
使用ORM时,需要执行迁移操作以便在模型和持久化数据之间保持同步。我们使用Flask-Migrate这个扩展来完成该任务。
首先安装:
$ pip install flask-migrate $ pip install flask_script
然后在代码中引入:
from flask_script import Manager from flask_migrate import Migrate, MigrateCommand
进行必要的配置:
migrate = Migrate(app, db) manager = Manager(app) manager.add_command('db', MigrateCommand)
运行管理器:
if __name__ == '__main__': manager.run()
完整的代码如下:
from flask import Flask from flask_sqlalchemy import SQLAlchemy from flask_script import Manager from flask_migrate import Migrate, MigrateCommand app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://localhost/appdb' db = SQLAlchemy(app) migrate = Migrate(app, db) manager = Manager(app) manager.add_command('db', MigrateCommand) class Post(db.Model): id = db.Column(db.Integer(), primary_key=True) title = db.Column(db.String(80), unique=True) post_text = db.Column(db.String(255)) def __init__(self, title, post_text): self.title = title self.post_text = post_text @app.route('/') def index(): return "Hello World" if __name__ == "__main__": manager.run()
使用如下的命令初始化Alembic:
$ python app.py db init Creating directory /Users/Vihar/Desktop/flask-databases/migrations ... done ... ... ... Generating /Users/Vihar/Desktop/flask-databases/migrations/alembic.ini ... done
执行第一个迁移任务:
$ python app.py db migrate INFO [alembic.runtime.migration] Context impl PostgresqlImpl. INFO [alembic.runtime.migration] Will assume transactional DDL. INFO [alembic.autogenerate.compare] Detected added table 'post' Generating /Users/Vihar/Desktop/flask-databases/migrations/versions/ed3b3a028447_.py ... done
一旦上述命令执行完毕,我们的数据表就会创建成功。现在更新数据库:
$ python app.py db upgrade
汇智网翻译整理,转载请标明出处。原文链接:Flask框架web开发:零基础入门
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Eureka Server启用 https服务指北
文章共 591字,阅读大约需要 2分钟 ! 概 述 在我的前文《Eureka Server 开启Spring Security Basic认证》中已经给 Eureka Server 开启了最基本的鉴权措施,本文则让 HTTPS加持于 Eureka Server,让安全措施来的更彻底一点。 注: 本文首发于 My Personal Blog:CodeSheep·程序羊,欢迎光临 小站 证书准备 这里使用 JDK自带的 keytools 来创建证书 Server 端证书生成 keytool -genkeypair -alias server -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore codesheepserver.p12 -validity 3800 过程如下: Client 端证书生成 keytool -genkeypair -alias client -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore codesheepclient.p12 -validity 38...
- 下一篇
随行付微服务测试之接口测试和契约测试
背景 日常开发过程中,项目的接口通常由服务提供方约定和提供,微服务模式下接口被多个消费者调用更是常态,那么提供方接口的变更如何快速、高效、无遗漏的通知给消费者呢?另外,当一个service同时被多个使用者调用,如何保证对service的修改可以让其它所有使用者造成的影响都能被感知到?这些问题契约测试可以给你答案。另外,微服务模式下,接口测试是非常重要的测试手段,它在实际的项目中帮助验证微服务之间的协同和交互,大幅降低测试成本和提高测试效率方面提供了很大帮助,可以说接口测试是业务功能测试前置的助推器。因此,这里对这两种测试手段进行介绍。 接口测试和契约测试所处的阶段 在实际的工作中,结合随行付的实际情况我们对自动化测试金字塔原理进行了定制,加入契约自动化测试内容,形成如下新版自动化测试金字塔结构。 由图可知,一个项目的测试过程,从项目推进的维度,首先进行单元测试,其次接口自动化测试、契约测试,最后UI自动化测试和手工测试。 微服务模式下如何开展接口测试 接口测试属于集成测试范畴,他是单元测试的扩展和延续。它主要的关注点是内部接口功能实现是否完整,比如说内部逻辑是不是正常,异常处理是不是正...
相关文章
文章评论
共有0条评论来说两句吧...