0
点赞
收藏
分享

微信扫一扫

【Web开发】Python实现Web服务器(Flask入门)


🍺Web服务器系列相关文章编写如下🍺:

  1. 🎈【Web开发】Node.js实现Web服务器(http模块)🎈
  2. 🎈【Web开发】Node.js实现Web服务器(express模块)🎈
  3. 🎈【Web开发】Python实现Web服务器(Flask入门)🎈
  4. 🎈【Web开发】Python实现Web服务器(Flask测试)🎈
  5. 🎈【Web开发】Python实现Web服务器(Tornado入门)🎈
  6. 🎈【Web开发】Python实现Web服务器(Tornado+flask+nginx)🎈
  7. 🎈【Web开发】Python实现Web服务器(FastAPI)🎈
  8. 🎈【Web开发】Android手机上基于Termux实现Web服务器(Python、node.js)🎈

文章目录

  • ​​1、简介​​
  • ​​2、配置开发环境​​
  • ​​2.1 配置python​​
  • ​​2.2 配置VSCode​​
  • ​​3、官网示例测试​​
  • ​​3.1 代码示例1(最小的应用)​​
  • ​​3.2 代码示例2(修改ip和端口号)​​
  • ​​3.3 代码示例3(变量规则)​​
  • ​​3.4 代码示例4(URL构建)​​
  • ​​3.5 代码示例5(HTTP方法)​​
  • ​​3.6 代码示例6(会话)​​
  • ​​3.7 代码示例7(文件上传下载)​​
  • ​​3.8 代码示例8(返回json)​​
  • ​​3.9 代码示例9(返回图片)​​
  • ​​3.10 代码示例10(添加页面图标)​​
  • ​​4、扩展功能​​
  • ​​4.1 flask-admin​​
  • ​​结语​​

1、简介

​​https://flask.palletsprojects.com/en/2.1.x/​​​​https://flask.net.cn/​​

Flask是一个用Python编写的Web应用程序框架。 它由 Armin Ronacher 开发,他领导一个名为Pocco的国际Python爱好者团队。 Flask基于Werkzeug WSGI工具包和Jinja2模板引擎。两者都是Pocco项目。

【Web开发】Python实现Web服务器(Flask入门)_flask

2、配置开发环境

2.1 配置python

安装virtualenv,并创建所需的虚拟环境。

pip install

【Web开发】Python实现Web服务器(Flask入门)_web server_02


将在当前文件夹中创建新的虚拟环境:

mkdir myproject
cd myproject
virtualenv venv
venv\scripts\activate

注意:
(1)创建虚拟环境
如果使用venv,使用命令:$ python -m venv tutorial-env
如果使用virtualenv,则使用下面的命令:$ virtualenv snow-venv
如果你使用Python 3.3及以上版本,推荐使用标准库内置的venv 模块替代virtualenv。
如果你使用Python 2,就只能选择virtualenv,你需要额外安装它。pip install virtualenv

(2)激活虚拟环境
Windows(CMD.exe):$ tutorial-env\Scripts\activate.bat
Linux和macOS(bash/zsh):$ source tutorial-env/bin/activate

(3)退出虚拟环境:deactivate

【Web开发】Python实现Web服务器(Flask入门)_web服务器_03


通过键入 deactivate 来停用环境,您将返回正常的 shell。

deactivate

检测python虚拟环境安装是否成功。

import sys
# 输出python.exe路径
print(sys.executable)
# 输出lib路径
print(sys.prefix)

【Web开发】Python实现Web服务器(Flask入门)_web server_04


将在当前文件夹中安装flask库:

pip install

【Web开发】Python实现Web服务器(Flask入门)_python_05


接下来,我们安装这个项目所需的包。这可以通过 pip 安装所有的包,或者通过在项目的 GitHub 仓库中找到的requirements.txt文件来完成。

pip install

2.2 配置VSCode

把需要使用该环境的项目文件夹添加到工作区。
按下ctrl+,打开设置;
搜索框中搜索env,点击你的项目,在左边选扩展->python,如下图:

在Python:Venv Path一行添加你的虚拟环境文件夹,注意文件夹间以逗号分隔。

【Web开发】Python实现Web服务器(Flask入门)_three.js_06


之后搜索python path,左边选扩展->python,下拉找到Python:Python Path,填入你的虚拟环境中的python解析器路径,如下图:

【Web开发】Python实现Web服务器(Flask入门)_flask_07

3、官网示例测试

3.1 代码示例1(最小的应用)

新建文件hello.py,输入如下内容:

  • hello.py

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
return 'Hello, World!'

执行之后,然后在VsCode的终端命令行输入如下命令:

set FLASK_APP=hellp.py
flask run

如果执行报错的话,可以试试如下代码:

$env:FLASK_APP="hello.py"

当然也可以将hello.py改成app.py的话,直接执行flask run也可以。

执行结果反馈如下:

【Web开发】Python实现Web服务器(Flask入门)_flask_08


网页访问结果如下:

【Web开发】Python实现Web服务器(Flask入门)_web server_09

3.2 代码示例2(修改ip和端口号)

新建文件hello2.py,输入如下内容:

  • hello2.py:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
return 'Hello World,爱看书的小沐!'

if __name__ == '__main__':
# app.run()
app.run(host="127.0.0.1", port="8080")

执行结果如下:

【Web开发】Python实现Web服务器(Flask入门)_three.js_10

浏览器访问结果如下:

【Web开发】Python实现Web服务器(Flask入门)_python_11

3.3 代码示例3(变量规则)

新建文件hello3.py,输入如下内容:

  • hello3.py:

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

@app.route('/')
def hello_world():
return 'Hello World,爱看书的小沐!'

@app.route('/user/<username>')
def show_user_profile(username):
# show the user profile for that user
return 'User: %s' % escape(username)

@app.route('/post/<int:post_id>')
def show_post(post_id):
# show the post with the given id, the id is an integer
return 'Post: %d' % post_id

@app.route('/rev/<float:revNo>')
def revision(revNo):
return 'Revision Number: %f' % revNo

@app.route('/path/<path:path_name>')
def show_subpath(path_name):
# show the subpath after /path/
return 'Path: %s' % escape(path_name)

if __name__ == '__main__':
# app.run()
app.run(host="127.0.0.1", port="8080")

浏览器访问结果如下:

【Web开发】Python实现Web服务器(Flask入门)_web服务器_12

3.4 代码示例4(URL构建)

新建文件hello4.py,输入如下内容:

  • hello4.py:

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

@app.route('/')
def index():
return 'hello, index, 这是看书的小沐的首页!'

@app.route('/login')
def login():
return 'hello, login'

@app.route('/admin')
def hello_admin():
return 'Hello Admin'

@app.route('/guest/<guest>')
def hello_guest(guest):
return 'Hello %s as Guest' % guest
# return '{}\'s profile'.format(escape(guest))

@app.route('/user/<username>')
def profile(username):
if username =='admin':
return redirect(url_for('hello_admin'))
else:
return redirect(url_for('hello_guest', guest = username))

with app.test_request_context():
print(url_for('index'))
print(url_for('login'))
print(url_for('login', abc='/'))
print(url_for('profile', username='爱看书的小沐'))

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

执行代码结果如下:

【Web开发】Python实现Web服务器(Flask入门)_python_13


浏览器访问网址:http://127.0.0.1:5000/user/tomcat

【Web开发】Python实现Web服务器(Flask入门)_flask_14

浏览器访问网址:http://127.0.0.1:5000/user/admin

【Web开发】Python实现Web服务器(Flask入门)_python_15


浏览器访问网址:http://127.0.0.1:5000

【Web开发】Python实现Web服务器(Flask入门)_web服务器_16

3.5 代码示例5(HTTP方法)

在myproject里新建子文件夹templates,用来存放flask的模板网页,这里新建一个测试网页hello5.html,内容如下:

<html>
<body>
<form action = "http://localhost:5000/login" method = "post">
<p>Enter Name:</p>
<p><input type = "text" name = "message" /></p>
<p><input type = "submit" value = "submit" /></p>
</form>
</body>
</html>

新建文件hello5.py,输入如下内容:

  • hello5.py:

from flask import Flask, redirect, url_for, request, render_template
app = Flask(__name__)

@app.route('/')
def index():
return render_template('hello5.html')

@app.route('/success1/<name>')
def get_success(name):
return 'get: welcome %s' % name

@app.route('/success2/<name>')
def post_success(name):
return 'post: welcome %s' % name

@app.route('/login',methods = ['POST', 'GET'])
def login():
if request.method == 'POST':
user = request.form['message']
return redirect(url_for('post_success',name = user))
else:
user = request.args.get('message')
return redirect(url_for('get_success',name = user))

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

浏览器访问网址:http://127.0.0.1:5000

【Web开发】Python实现Web服务器(Flask入门)_three.js_17


文本框输入“爱看书的小沐”,点击按钮submit之后,

【Web开发】Python实现Web服务器(Flask入门)_web服务器_18

3.6 代码示例6(会话)

有一种称为 session 的对象,允许你在不同请求 之间储存信息。这个对象相当于用密钥签名加密的 cookie ,即用户可以查看你的 cookie ,但是如果没有密钥就无法修改它。
使用会话之前你必须设置一个密钥,使用下面的命令生成随机数:

python -c 'import os; print(os.urandom(16))'

  • hello6.py:

from flask import Flask, session, redirect, url_for, escape, request

app = Flask(__name__)

# Set the secret key to some random bytes. Keep this really secret!
app.secret_key = b'\xc0)\xb0\x97\x9f\xd8\x86\x83:\x19\x9fx\xb4h\xd4\x17'

@app.route('/')
def index():
if 'username' in session:
return 'Logged in as %s' % escape(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(url_for('index'))
return '''
<form method="post">
<p><input type=text name=username>
<p><input type=submit value=Login>
</form>
'''

@app.route('/logout')
def logout():
# remove the username from the session if it's there
session.pop('username', None)
return redirect(url_for('index'))

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

浏览器访问网址:http://127.0.0.1:5000/login

【Web开发】Python实现Web服务器(Flask入门)_flask_19


输入用户名之后,

【Web开发】Python实现Web服务器(Flask入门)_flask_20


或者:

  • hello6_2.py:

from flask import render_template
from flask import make_response
from flask import Flask, session, redirect, url_for, escape, request

app = Flask(__name__)
app.secret_key = 'fkdjsafjdkfdlkjfadskjfadskljdsfklj'

@app.route('/')
def index():
if 'username' in session:
username = session['username']
return '登录用户名是:' + username + '<br>' + \
"<b><a href = '/logout'>点击这里注销</a></b>"
return "您暂未登录, <br><a href = '/login'></b>" + \
"点击这里登录</b></a>"

@app.route('/login', methods = ['GET', 'POST'])
def login():
if request.method == 'POST':
session['username'] = request.form['username']
return redirect(url_for('index'))
return '''
<form action = "" method = "post">
<p><input type="text" name="username"/></p>
<p><input type="submit" value ="登录"/></p>
</form>
'''
@app.route('/logout')
def logout():
# remove the username from the session if it is there
session.pop('username', None)
return redirect(url_for('index'))

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

3.7 代码示例7(文件上传下载)

在myproject里新建子文件夹templates,用来存放flask的模板网页,这里新建一个测试网页hello7.html,内容如下:

  • hello7.html:

<html>
<head>
<title>File Upload</title>
</head>
<body>
<form action="http://localhost:5000/uploader" method="POST" enctype="multipart/form-data">
<input type="file" name="file" />
<input type="submit" value="提交" />
</form>
</body>
</html>

  • hello7.py(文件上传代码):

from flask import Flask, render_template, request
from werkzeug.utils import secure_filename

import os

app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = 'upload/'

@app.route('/')
def index():
return render_template('hello6.html')

@app.route('/upload')
def upload_file():
return render_template('upload.html')

@app.route('/uploader',methods=['GET','POST'])
def uploader():
if request.method == 'POST':
f = request.files['file']
print(request.files)
f.save(os.path.join(app.config['UPLOAD_FOLDER'], secure_filename(f.filename)))
return 'file uploaded successfully'
else:
return render_template('upload.html')

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

浏览器访问网址:http://127.0.0.1:5000

【Web开发】Python实现Web服务器(Flask入门)_flask_21


选择一个文件beijing1.tif,点击按钮“提交”,

【Web开发】Python实现Web服务器(Flask入门)_python_22


【Web开发】Python实现Web服务器(Flask入门)_web服务器_23

  • hello7_2.py(文件下载代码):

from flask import Flask
from flask import send_file, send_from_directory, make_response, request
import os

app = Flask(__name__)

# @app.route('/login', methods = ["GET","POST"])
# def login():
# name = request.args.get("username")
# password = request.args.get("userpwd")
# if name== 'admin' and password=='admin':
# #return redirect(url_for('use'))
# return '登录成功'
# else:
# return '登录失败'

@app.route("/download/<filename>", methods=['GET'])
def download_file(filename):
# send_from_directory:第1个参数是本地目录的path, 第2个参数是文件名(带扩展名)
directory = os.getcwd() + "\\static\\images\\"
return send_from_directory(directory, filename, as_attachment=True)

@app.route("/download2/<filename>", methods=['GET'])
def download_file2(filename):
directory = os.getcwd() + "\\static\\images\\"
response = make_response(send_from_directory(directory, filename, as_attachment=True))
response.headers["Content-Disposition"] = "attachment; filename={}".format(filename.encode().decode('latin-1'))
return response

@app.route("/download3/<path:path>", methods=['GET'])
def download_file3(path):
# 此处的filepath是文件的路径,但是文件必须存储在static文件夹下, 比如images\test.jpg
return app.send_static_file(path)

@app.route('/favicon.ico')
def favicon():
return send_from_directory(os.path.join(app.root_path, 'static'), 'favicon.ico'
, mimetype='image/vnd.microsoft.icon')

if __name__ == '__main__':
app.run(debug = True)
#app.run(host="0.0.0.0", port=8080, threaded=True)

3.8 代码示例8(返回json)

  • hello8.py:

from flask import Flask, request, abort, make_response
import json

app = Flask(import_name=__name__)

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

data = {
"user_name": "爱看书的小沐",
"user_age": 18,
"city": "beijing",
}

res_json = json.dumps(data)
#return res_json
#return res_json, 200, {"Content-Type":"application/json"}
#return jsonify(token=123456, gender=0)
return jsonify(data)

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

浏览器访问结果如下:

【Web开发】Python实现Web服务器(Flask入门)_python_24

3.9 代码示例9(返回图片)

  • hello9.py:

# encoding:utf8
from io import FileIO
from flask import Response, Flask

app = Flask(__name__)

@app.route("/image/<imageid>")
def index(imageid):
#image = FileIO("images/{}.png".format(imageid))
with open("images/{}.png".format(imageid), 'rb') as f:
image = f.read()
resp = Response(image, mimetype="image/png")
return resp

app.run(debug=True)

浏览器访问结果如下:

【Web开发】Python实现Web服务器(Flask入门)_web server_25


【Web开发】Python实现Web服务器(Flask入门)_flask_26

3.10 代码示例10(添加页面图标)

那么如何给一个 Flask 应用添加一个页面图标呢?首先,显而易见的,需要一个图 标。图标应当是 16 X 16 像素的 ICO 格式文件。这不是规定的,但却是一个所有浏 览器都支持的事实上的标准。把 ICO 文件命名为 favicon.ico 并放入静态 文件目录中。

  • 方法1:
    在你的 HTML 中添加一个链接:

<link rel="shortcut icon" href="{{ url_for('static', filename='favicon.ico') }}">

  • 方法2:
    但是一些老古董不支持这个标准。老的 标准是把名为“ favicon.ico ”的图标放在服务器的根目录下。如果你的应用不是 挂接在域的根目录下,那么你需要定义网页服务器在根目录下提供这个图标,否则就 无计可施了。如果你的应用位于根目录下,那么你可以简单地进行重定向:

app.add_url_rule('/favicon.ico', redirect_to=url_for('static', filename='favicon.ico'))

  • 方法3:
    如果想要保存额外的重定向请求,那么还可以使用 send_from_directory() 函数来写一个视图:

import os
from flask import send_from_directory

@app.route('/favicon.ico')
def favicon():
return send_from_directory(os.path.join(app.root_path, 'static'),
'favicon.ico', mimetype='image/vnd.microsoft.icon')

上例中的 MIME 类型可以省略,浏览器会自动猜测类型。

4、扩展功能

4.1 flask-admin

​​https://flask-admin.readthedocs.io/​​

安装扩展flask-admin:

cd D:\test\myproject
virtualenv venv
venv\scripts\activate
pip install

【Web开发】Python实现Web服务器(Flask入门)_web服务器_27

  • 测试代码1

from flask import Flask
from flask_admin import Admin

app = Flask(__name__)

# set optional bootswatch theme
app.config['FLASK_ADMIN_SWATCH'] = 'cerulean'

admin = Admin(app, name='microblog', template_mode='bootstrap3')
# Add administrative views here

app.run()

运行结果:

【Web开发】Python实现Web服务器(Flask入门)_web服务器_28

  • 常用的Flask插件如下:
    Flask-SQLalchemy:操作数据库;
    Flask-migrate:管理迁移数据库;
    Flask-Mail:邮件;
    Flask-WTF:表单;
    Flask-script:插入脚本;
    Flask-Login:认证用户状态;
    Flask-RESTful:开发REST API的工具;
    Flask-Bootstrap:集成前端Twitter Bootstrap框架;
    Flask-Moment:本地化日期和时间;
    集成支持单元测试、RESTful请求调度、支持安全cookies、基于Unicode、SQLite。
    Flask的两个主要核心应用是Werkzeug和模板引擎Jinja,除此以外,别的都是可以自由组装的。

结语

如果您觉得该方法或代码有一点点用处,可以给作者点个赞;╮( ̄▽ ̄)╭
如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进。o_O???
如果您需要相关功能的代码定制化开发,可以留言私聊作者。(✿◡‿◡)
感谢各位童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!


【Web开发】Python实现Web服务器(Flask入门)_python_29


举报

相关推荐

0 条评论