Flask

安装

安装pip.exe文件

1
python -m ensurepip

安装flask

1
pip install flask

报错

1
2
3
4
5
note: This error originates from a subprocess, and is likely not a problem with pip.
error: subprocess-exited-wi th-error
× pip subprocess to install build dependencies did not run successfully.
exit code: 2
→ See above for output.

错误原因:缺少了两个依赖的库

解决

1
2
pip install pyinstaller
pip install wheel

重新运行pip install flask命令,成功。

创建虚拟环境

创建flask文件夹,在命令行中进入这个目录后创建venv文件夹并激活解释器

1
2
python -m venv venv
venv\Scripts\activate
1
(venv) $ pip install flask

(不确定是否需要,在虚拟环境内外都安装了一遍)

编写程序

创建文件夹app,在里面新建两个.py文件

__init__.py写入

1
2
3
4
from flask import Flask # 引入Flask对象

app = Flask(__name__) # 创建Flask实例
from app import routes #引入route模块(循环引入)

routes.py写入

1
2
3
4
5
6
from app import app # 第一个app指app包,第二个app指app实例。

@app.route('/') # 用装饰器定义的超链接
@app.route('/index')
def index(): # 视图函数
return "Hello, World!"

定义了一个返回Hello, World!字符串的视图函数。

返回上级目录新建microblog.py,写入

1
from app import app

这样就定义了一个应用入口以启动应用。

也可以不分开模块,只建立主程序,在其中写进需要的函数以触发函数和启动应用。

app.py

1
2
3
4
5
6
7
8
9
from flask import Flask
app = Flask(__name__)

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

if __name__ =="__main__":
app.run(debug=True,port=8080)

运行程序

1
(venv)$ flask run
1
2
3
4
5
* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server insteac
Running on http:// 127.0.0. 1:5000
Press CTRL+C to quit
127.0.0.1一一[19/Mar/2024 13:13:12] GET / HTTP/1.1200

浏览器打开本机的5000端口,成功运行。

如果上一步使用了方法二,可以直接执行app.py文件

1
$ python app.py
1
2
3
4
5
6
7
8
 * Serving Flask app 'app'
* Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on http://127.0.0.1:8080
Press CTRL+C to quit
* Restarting with stat
* Debugger is active!
* Debugger PIN: 121-096-704

浏览器打开本机8080端口,报错:127.0.0.1 已拒绝连接。

自查原因:

1
ping localhost
1
2
3
4
5
6
7
8
9
10
正在 Ping DESKTOP-DF7NKT4 [::1] 具有 32 字节的数据:
来自 ::1 的回复: 时间<1ms
来自 ::1 的回复: 时间<1ms
来自 ::1 的回复: 时间<1ms
来自 ::1 的回复: 时间<1ms

::1 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 0ms,平均 = 0ms

解决问题:

1.安装IIS

控制面板-程序-程序和功能-启用或关闭Windows功能,勾上Internet Information Services与Internet Information Services可承载的Web核心

2.修改C:\Windows\System32\drivers\etc下的hosts文件,在末尾加上下面两行:

1
2
127.0.0.1 localhost
localhost 127.0.0.1

3.修改ipv6优先级

管理员:Windows PowerShell

1
netsh interface ipv6 show prefixpolicies

windows的优先解析列表中ipv6的优先级高于ipv4

1
2
3
4
5
6
7
8
9
10
11
12
13
查询活动状态...

优先顺序 标签 前缀
---------- ----- --------------------------------
50 0 ::1/128
40 1 ::/0
35 4 ::ffff:0:0/96
30 2 2002::/16
5 5 2001::/32
3 13 fc00::/7
1 11 fec0::/10
1 12 3ffe::/16
1 3 ::/96

修改优先级:

1
2
3
4
5
6
7
8
9
netsh int ipv6 set prefix ::/96 50 0
netsh int ipv6 set prefix ::ffff:0:0/96 40 1
netsh int ipv6 set prefix 2002::/16 35 2
netsh int ipv6 set prefix 2001::/32 30 3
netsh int ipv6 set prefix ::1/128 10 4
netsh int ipv6 set prefix ::/0 5 5
netsh int ipv6 set prefix fc00::/7 3 13
netsh int ipv6 set prefix fec0::/10 1 11
netsh int ipv6 set prefix 3ffe::/16 1 12

重试,成功运行。

1
127.0.0.1 - - [22/Mar/2024 13:53:27] "GET / HTTP/1.1" 200 -

使用HTML模板

使用拼接的HTML字符串来展示user字典的数据

1
2
3
4
5
6
7
8
9
10
11
12
@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>'''

模板

1
2
3
4
5
6
7
8
<html>
<head>
<title>{{title}} - microblog</title>
</head>
<body>
<h1>Hello, {{user.nickname}}!</h1>
</body>
</html>

{{}}中存放动态内容,可以从视图函数中传入。

视图函数中使用html模板

为了渲染模板,Flask框架提供了名为render_template的新函数,该函数需要传入模板名以及一些模板参数的变量列表,返回一个所有占位符都被传入的变量替换的字符串结构。用模板参数提供的相应值替换

1
2
3
4
5
def index():
user = { 'nickname': 'Miguel' } # 定义变量
return render_template("index.html",
title = 'Home',
user = user)#传入模板名、模板变量列表

模板中的条件、循环、继承语句

条件控制

1
2
3
4
5
6
7
8
9
10
11
12
<html>
<head>
{% if title %}
<title>{{title}} - microblog</title>
{% else %}
<title>Welcome to microblog</title>
{% endif %}
</head>
<body>
<h1>Hello, {{user.nickname}}!</h1>
</body>
</html>

循环控制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<html>
<head>
{% if title %}
<title>{{title}} - microblog</title>
{% else %}
<title>microblog</title>
{% endif %}
</head>
<body>
<h1>Hi, {{user.nickname}}!</h1>
{% for post in posts %}
<p>{{post.author.nickname}} says: <b>{{post.body}}</b></p>
{% endfor %}
</body>
</html>

模板继承

把所有模板公共的部分移除出页面的布局,把它们放在一个基础模板中,所有使用它的模板可以继承该基础模板。

基础模板(base.html)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<html>
<head>
{% if title %}
<title>{{title}} - microblog</title>
{% else %}
<title>microblog</title>
{% endif %}
</head>
<body>
<div>Microblog: <a href="/index">Home</a></div>#设置导航窗口
<hr>
{% block content %}{% endblock %}
</body>
</html>

使用 block 控制语句来定义派生模板content可以插入的位置

继承模板(index.html)
1
2
3
4
5
6
7
{% extends "base.html" %}
{% block content %}
<h1>Hi, {{user.nickname}}!</h1>
{% for post in posts %}
<div><p>{{post.author.nickname}} says: <b>{{post.body}}</b></p></div>
{% endfor %}
{% endblock %}

使用extends 语句建立两个模板的继承关系。

使用表单

创建表单收集信息,将模板文件命名为bio_form.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!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

1
2
3
4
5
6
7
8
9
10
11
12
13
@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")

show_bio.html

1
2
3
4
5
6
7
8
9
10
11
12
13
<!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>

Docker+wsl安装

安装wsl

cmd输入命令:

1
wsl --install

响应

1
2
3
4
正在安装:虚拟机平台已安装虚拟机平台。
正在安装:适用于Linux的 Windows子系统已安装适用于Linux 的 Windows子系统。正在安装:适用于 Linux的 Windows子系统已安装适用于Linux的 Windows子系统。正在安装:Ubuntu
己安装 Ubuntu。
请求的操作成功。直到重新启动系统前更改将不会生效。

启用Hyber-V

桌面建立txt文件,输入代码

1
2
3
4
5
pushd "%~dp0"
dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt
for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
del hyper-v.txt
Dism /online /enable-feature /featurename:Microsoft-Hyper-V-All /LimitAccess /ALL

将文件重命名为Hyber-V.bat,右键管理员身份运行部署映像服务和管理工具

控制面板-程序-程序与功能-启动或关闭windows功能,勾上Hyber-V

安装配置Docker Desktop

安装Docker Desktop Installer.exe

提示:当前无法访问smartscreen

解决:开始-设置-隐私和安全性-windows安全中心-打开windows安全中心-选择【应用和浏览器控制】,关闭

拉取国内镜像源

settings -> docker engine,加入代码:、

1
2
3
4
5
6
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://mirror.ccs.tencentyun.com"
]

报错:

1
Unexpected non-whitespace character after JSON at position 124

尝试1:管理员身份打开powershell更新

尝试2:修改DNS地址

尝试3:更新wsl(?)

报错:

1
Error code: Wsl/UpdatePackage/WININET_E_CANNOT_CONNECT

解决问题:更改属性顺序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"registry-mirrors" : [
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn",
"https://cr.console.aliyun.com",
"https://mirror.ccs.tencentyun.com"
],
"builder": {
"gc": {
"defaultKeepStorage": "20GB",
"enabled": true
}
},
"experimental": false,
"features": {
"buildkit": true
}
}

不懂什么原理但是成功通过