欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Flask框架web开发之零基础入门

程序员文章站 2022-04-29 17:40:24
flask框架是python开发的一个基于werkzeug和jinja 2的web开发微框架,它的优势就是极其简洁, 但又非常灵活,而且容易学习和应用。因此flask框架是...

flask框架是python开发的一个基于werkzeug和jinja 2的web开发微框架,它的优势就是极其简洁, 但又非常灵活,而且容易学习和应用。因此flask框架是python新手快速开始web开发最好的选择,此外, 使用flask框架的另一个好处在于你可以非常轻松地将基于python的机器学习算法或数据分析算法集成到 web应用中。

Flask框架web开发之零基础入门 

1、可以用flask框架做什么

从博客应用到克隆一个facebook或者twitter,理论上你可以用flask做任何事情。有很多库 可以直接使用,例如flask-sockets,flask-google-maps等,而且flask框架支持mysql、postgresql、 mongodb等诸多数据库。

我能想到的一些可以用flask框架实现的web应用类型:博客应用、聊天应用、仪表盘应用、rest api、管理页面、邮件服务等。

如果希望深入学习flask web开发,推荐这个教程:深入浅出flask 安装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

你应该会看到如下输入:

现在就可以打开浏览器访问 http://127.0.0.1:8080/ 了:

* 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

Flask框架web开发之零基础入门

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

Flask框架web开发之零基础入门

拼接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

Flask框架web开发之零基础入门

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开发之零基础入门

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。