Flask 安装 安装pip.exe文件
安装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 app = Flask(__name__) from app import routes
routes.py
写入
1 2 3 4 5 6 from app import app @app.route('/' ) @app.route('/index' ) def index (): return "Hello, World!"
定义了一个返回Hello, World!
字符串的视图函数。
返回上级目录新建microblog.py
,写入
这样就定义了一个应用入口以启动应用。
也可以不分开模块,只建立主程序,在其中写进需要的函数以触发函数和启动应用。
app.py
1 2 3 4 5 6 7 8 9 from flask import Flaskapp = Flask(__name__) @app.route('/' ) def hello_world (): return 'Hello, World!' if __name__ =="__main__" : app.run(debug=True ,port=8080 )
运行程序
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.1 ” 200
浏览器打开本机的5000端口,成功运行。
如果上一步使用了方法二,可以直接执行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 2 3 4 5 6 7 8 9 10 正在 Ping DESKTOP-DF7NKT4 [::1 ] 具有 32 字节的数据: 来自 ::1 的回复: 时间<1 ms 来自 ::1 的回复: 时间<1 ms 来自 ::1 的回复: 时间<1 ms 来自 ::1 的回复: 时间<1 ms ::1 的 Ping 统计信息: 数据包: 已发送 = 4 ,已接收 = 4 ,丢失 = 0 (0 % 丢失), 往返行程的估计时间(以毫秒为单位): 最短 = 0 ms,最长 = 0 ms,平均 = 0 ms
解决问题:
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 3 ffe::/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 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 } }
不懂什么原理但是成功通过