Flask框架基础1

1. Flask框架介绍

Flask是一款基于Python编写的轻量级Web应用框架。它使用Werkzeug作为底层WSGI工具箱,并使用Jinja2模板引擎实现模板化。Flask的代码简单易懂,灵活可拓展,适用于小型到中型的Web应用。

1.1 Flask安装

在使用Flask框架之前,首先需要在本机上安装Flask。可以使用pip包管理器来安装Flask:

pip install Flask

1.2 Hello World程序

下面我们来编写最简单的hello world程序。在.py文件中输入以下代码:

from flask import Flask

app = Flask(__name__)

@app.route("/")

def hello():

return "Hello World!"

if __name__ == "__main__":

app.run()

这个程序定义了一个Flask应用及其路由。我们在浏览器中输入http://127.0.0.1:5000/,就可以看到"Hello World!"这个字符串显示在页面上了。

2. 路由和视图函数

在Flask中,路由是指根据URL请求路径匹配合适的处理逻辑。路由由Flask应用的路由装饰器装饰函数实现。常用的Flask路由装饰器有@app.route和@app.errorhandler。

2.1 @app.route装饰器

@app.route装饰器用来设定URL路由,它将URL路径和我们编写的视图函数之间建立映射关系。下面是一个简单的例子:

@app.route('/')

def index():

return 'Index Page'

@app.route('/hello')

def hello():

return 'Hello, World'

这个例子定义了两个路由:根路由和'/hello'路由。当我们在浏览器中请求根路由和'/hello'路由时,Flask就会调用相应的视图函数index()和hello(),并返回对应的结果。

注意,@app.route('/')中的'/'表示根路由。它可能被用作站点入口或重定向到其他页面。

2.2 URL规则

URL规则定义了URL路径应该匹配哪个视图函数。可以根据URL参数进行匹配,也可以使用正则表达式。

URL参数的语法形式为""。例如:

@app.route('/user/')

def show_user_profile(username):

return 'User %s' % username

@app.route('/post/')

def show_post(post_id):

return 'Post %d' % post_id

@app.route('/path/')

def show_subpath(subpath):

return 'Subpath %s' % subpath

2.3 视图函数

视图函数是指用来响应HTTP请求的函数。视图函数接收HTTP请求,并返回HTTP响应。以下是一个简单的视图函数示例:

from flask import Flask

app = Flask(__name__)

@app.route('/')

def hello():

return 'Hello World!'

在上面的示例中,当用户访问根URL时,Flask将调用名为hello()的函数来为用户提供响应。

视图函数可以接收URL参数和查询参数。URL参数以字符串或数字的形式传递给函数,查询参数则以字典的形式传递给函数。例如:

@app.route('/item/')

def show_item(id):

return 'Item %s' % id

@app.route('/search')

def search():

keyword = request.args.get('keyword')

return 'Searching for %s' % keyword

在show_item()函数中,我们使用了URL参数id来接收从URL路径中传递进来的值。在search()函数中,我们使用request.args.get()方法来获取查询参数keyword的值。

3. 模板

模板是指用来渲染动态网页的HTML文件。Flask支持Jinja2引擎来实现模板化。

3.1 模板文件

模板文件存放在Flask应用的templates文件夹中。默认情况下,Flask将查找templates文件夹中与路由函数同名的模板文件。例如:

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/user/')

def show_user_profile(username):

return render_template('user.html', username=username)

在上面的示例中,我们将渲染user.html模板,该模板位于应用的templates文件夹中。注意,通过render_template()方法来渲染模板,方法的第一个参数是模板文件的名称。

3.2 模板语言

Jinja2模板语言是一种Python风格的模板语言。它主要用于渲染动态网页,包括HTML、CSS和JavaScript等内容。Jinja2具有良好的模板继承机制、控制流和过滤器等方面的特性,使得像Django这样的Python Web框架广泛使用。

Jinja2模板语言具有以下特点:

- 通过{{...}}语法插入变量;

- 通过{%...%}语法实现控制流;

- 支持过滤器、宏命令等功能。

下面是一个简单的Jinja2模板示例:

{{ title }}

{{ title }}

{% if user %}

Welcome, {{ user }}!

{% else %}

Welcome, guest!

{% endif %}

{% for post in posts %}

{{ post }}

{% endfor %}

在上面的模板中-我们可以看到使用{{...}}来输出变量。同时,控制流通过{%...%}来实现,如if,for等,其中if语句来判断user是否存在,for语句则来渲染多个post。为了传递这些变量,我们需要在视图函数中将变量作为参数传递给render_template()函数:

@app.route('/')

def index():

return render_template('index.html', title='Home Page', user='Terry', posts=[

'Python is cool',

'Flask is awesome',

'Jinja2 templates rock!'

])

在访问首页时,Flask将调用名为index()的函数,并传递了三个参数:title、user和posts。这些参数将被传递给Jinja2模板引擎,并用于渲染HTML页面。

4. 静态文件

静态文件是Web应用中不变的资源,如图片、CSS、JavaScript文件等。Flask可以将这些文件存放在应用的static文件夹中,并通过特定的URL路由来访问这些文件。

4.1 存储静态文件

静态文件存放在应用的static文件夹中。例如,我们可以在static文件夹中创建css、js和img等文件夹,用于存放对应的CSS、JavaScript和图片文件。

├── myapp.py

├── templates

│ └── index.html

└── static

├── css

│ └── style.css

├── js

│ └── script.js

└── img

├── logo.png

└── banner.jpg

4.2 URL路由

要访问静态文件,需要在路由函数中使用url_for()方法。例如:

from flask import Flask, url_for

app = Flask(__name__)

@app.route('/')

def index():

css_url = url_for('static', filename='css/style.css')

logo_url = url_for('static', filename='img/logo.png')

if __name__ == '__main__':

app.run()

在上面的示例中,我们使用url_for()方法来获得静态文件的URL路径。在index()函数中,我们将静态文件作为参数传递给url_for()方法,并通过字符串替换的方式将静态文件URL路径输出到HTML页面中。

5. 请求和响应

在Web应用中,请求是指浏览器向Web服务器发送的请求,响应是指Web服务器返回给浏览器的响应。Flask中提供了request和response对象来实现请求和响应的处理。

5.1 请求对象

在Flask中,每次HTTP请求都会生成一个request对象,用于存放请求数据和相关信息。可以通过request对象获取请求中的参数、请求头、请求方法等信息。例如:

from flask import Flask, request

app = Flask(__name__)

@app.route('/login', methods=['GET', 'POST'])

def login():

if request.method == 'POST':

username = request.form['username']

password = request.form['password']

remember_me = request.form.get('remember_me')

return f'Username: {username}, Password: {password}, Remember me: {remember_me}'

else:

return '''

'''

if __name__ == '__main__':

app.run()

在上面的示例中,我们编写了一个登录页面,当GET请求发送时,应用会返回一个HTML表单;当POST请求发送时,应用会从request.form中获取表单数据。

5.2 响应对象

在Flask中,每次HTTP响应都会生成一个response对象,用于存放响应数据和相关信息。可以通过response对象设置响应头、响应状态、响应类型等信息。例如:

from flask import Flask, make_response

app = Flask(__name__)

@app.route('/cookie')

def cookie():

response = make_response('Hello, World!')

response.set_cookie('username', 'Terry')

return response

if __name__ == '__main__':

app.run()

在上面的示例中,我们使用make_response()方法创建了一个response对象,并将返回结果设置为'Hello World!'。我们还调用了response对象的set_cookie()方法,将cookie设置为'username=Terry'。最后,我们返回response对象。

6. Flash和Session

在Web应用开发中,由于HTTP是一种无状态协议,因此需要使用一些机制来跟踪用户。Flask通过session和flash机制来实现用户状态跟踪。

6.1 Flash消息

Flash消息用于在一次HTTP请求之后,向用户显示一条临时消息。例如:

from flask import Flask, flash, redirect, render_template, url_for

app = Flask(__name__)

app.secret_key = 'dev'

@app.route('/')

def index():

return render_template('index.html')

@app.route('/login', methods=['GET', 'POST'])

def login():

if request.method == 'POST':

username = request.form['username']

password = request.form['password']

if not username or not password:

flash('Please enter username and password!')

else:

flash('Welcome, %s!' % username)

return redirect(url_for('index'))

return render_template('login.html')

if __name__ == '__main__':

app.run()

在上面的示例中,我们使用flash()函数来创建Flash消息。Flash消息会存储到session对象中,在下一次HTTP请求时可以读取并显示。在login页面中,我们使用{% with ... %}语句来读取并渲染Flash消息。

6.2 Session

Session是一种机制,用于在服务器端存储用户数据。在Flask中,使用session对象来进行Session管理。例如:

from flask import Flask, session, redirect, request

app = Flask(__name__)

app.secret_key = 'dev'

@app.route('/')

def index():

if 'username' in session:

return 'Logged in as %s' % session['username']

return 'You are not logged in'

@app.route('/login', methods=['GET', 'POST'])

def login():

if request.method == 'POST':

session['username'] = request.form['username']

return redirect('/')

return '''

'''

@app.route('/logout')

def logout():

session.pop('username', None)

return redirect('/')

if __name__ == '__main__':

app.run()

在上面的示例中,我们使用session对象来存储用户登录状态。在用户登录时,使用session['username']来设置用户状态;在用户注销时,使用session.pop()来清除用户状态。

7. 总结

本文介绍了Flask框架的基础知识,包括路由和视图函数、模板、静态文件、请求和响应、Flash和Session机制等方面的内容。通过学习本文,相信您已经能够基本使用Flask框架开发Web应用了。在实际开发中,需要注意安全性、可扩展性和性能等问题,以实现更好的用户体验和用户满意度。

后端开发标签