Python Flask 中的各种错误
Various errors in Python Flask
我最近制作了一个代码,它像 Apache 服务器一样工作,没有任何 index.html
问题是我的代码确实有问题,我得到了不同的错误(这就是为什么
我没写在标题里)
下面是我的作品照片
结构照片(位于C:\Users\YourUsername\Documents\webserver\
)
正如我之前所说,我得到了不同的错误:
- 当进入两个或更深的文件夹,然后尝试使用浏览器箭头返回,然后单击任何 file/folder 我得到
FileNotFoundError
- 当进入两个或更深的文件夹然后尝试使用 'up folder' 按钮 (
[ .. ]
) 时,我得到了 abort(404)
.CSS
文件的语法有点特殊,但内容很标准CSS
{
color: black;
}
现在我们有了主要代码,webserver.py
# -*- coding: utf-8 -*-
from flask import Flask, redirect, url_for, send_from_directory
from getpass import getuser
import os
### VARS ###
app = Flask('__main__')
SEP = os.sep
FOLDER_HOME = f'C:{SEP}Users{SEP}{getuser()}{SEP}Documents{SEP}webserver{SEP}'
FOLDER_STYLE = f'{FOLDER_HOME}styles{SEP}'
ONLINE_PATH = f''
app.config["ABS_PATH"] = f'C:{SEP}Users{SEP}{getuser()}{SEP}Documents{SEP}webserver{SEP}online{SEP}'
with open(f'{FOLDER_STYLE}STYLE_HTML.css', 'r', encoding='utf-8') as file: STYLE = " ".join(''.join(file.readlines()).split())
with open(f'{FOLDER_STYLE}STYLE_A.css', 'r', encoding='utf-8') as file: STYLE_A = " ".join(''.join(file.readlines()).split())
with open(f'{FOLDER_STYLE}STYLE_CLASS_ERROR.css', 'r', encoding='utf-8') as file: STYLE_ERROR = " ".join(''.join(file.readlines()).split())
with open(f'{FOLDER_STYLE}STYLE_CLASS_PDBTM.css', 'r', encoding='utf-8') as file: STYLE_PADDING_BOTTOM = " ".join(''.join(file.readlines()).split())
with open(f'{FOLDER_STYLE}STYLE_CLASS_HOME.css', 'r', encoding='utf-8') as file: STYLE_CLASS_HOME = " ".join(''.join(file.readlines()).split())
index_def1 = ['<!DOCTYPE html>', '<html>', '<head>', '<meta charset="utf-8">', f'<style type="text/css">html{STYLE} a{STYLE_A} .error{STYLE_ERROR} .pdbtm{STYLE_PADDING_BOTTOM} .home{STYLE_CLASS_HOME}</style>', f'<title>Index of /{ONLINE_PATH.replace(f"{SEP}", "/")}</title>', '</head>', '<body>', f'<h1 align="center">Index of /{ONLINE_PATH.replace(f"{SEP}", "/")}</h1>', '<br>', '<ul>', '[<a class="home pdbtm" href="/">HOME</a>]<br>', f'[<a class="home pdbtm" href="/{ONLINE_PATH}"> .. </a>]<br>']
index_file = []
index_def2 = ['</ul>', '</body>', '</html>']
### END ###
### FUNCTIONS ###
def process_html(dirs_list, files_list):
body = []
body.append('<br> --- Directorys --- </br>')
if dirs_list == []: body.append('<h2 class="error">No dirs found</h2>')
else:
for dirs in dirs_list:
body.append(f'<li class="pdbtm"><a href="/{dirs}">{dirs}/</a></li>')
body.append('<br> --- Files --- </br>')
if files_list == []: body.append('<h2 class="error">No files found</h2>')
else:
for files in files_list:
body.append(f'<li class="pdbtm"><a href="{files}">{files}</a></li>')
return body
def process_all(path, listed_directory):
dirs = []
files = []
for item in listed_directory:
if os.path.isfile(f'{path}{item}') == True: files.append(item)
else: dirs.append(item)
return dirs, files
### END ###
### ROUTES ###
@app.route('/')
def main():
global index_file
global ONLINE_PATH
global index_def1
ONLINE_PATH = ''
index_def1 = ['<!DOCTYPE html>', '<html>', '<head>', '<meta charset="utf-8">', f'<style type="text/css">html{STYLE} a{STYLE_A} .error{STYLE_ERROR} .pdbtm{STYLE_PADDING_BOTTOM} .home{STYLE_CLASS_HOME}</style>', f'<title>Index of /{ONLINE_PATH.replace(f"{SEP}", "/")}</title>', '</head>', '<body>', f'<h1 align="center">Index of /{ONLINE_PATH.replace(f"{SEP}", "/")}</h1>', '<br>', '<ul>', '[<a class="home pdbtm" href="/">HOME</a>]<br>', f'[<a class="home pdbtm" href="/{ONLINE_PATH}"> .. </a>]<br>']
app.config["ABS_PATH"] = f'C:{SEP}Users{SEP}{getuser()}{SEP}Documents{SEP}webserver{SEP}online{SEP}'
list_of_files = os.listdir(app.config["ABS_PATH"])
dirs, files = process_all(app.config["ABS_PATH"], list_of_files)
index_file = process_html(dirs, files)
index_comp = [index_def1, index_file, index_def2]
index = [item for sublist in index_comp for item in sublist]
return ''.join(index)
@app.route("/<path>")
def get_file(path):
while True:
try:
return send_from_directory(app.config["ABS_PATH"], filename=path, as_attachment=True)
except:
global index_file
global ONLINE_PATH
global index_def1
if path not in ONLINE_PATH: ONLINE_PATH += f'{path}{SEP}'
else: ONLINE_PATH = f'{path}{SEP}'
xyz = ONLINE_PATH.replace(path, '')
xyz = xyz[:-1]
xyz = ''.join(xyz)
index_def1 = ['<!DOCTYPE html>', '<html>', '<head>', '<meta charset="utf-8">', f'<style type="text/css">html{STYLE} a{STYLE_A} .error{STYLE_ERROR} .pdbtm{STYLE_PADDING_BOTTOM} .home{STYLE_CLASS_HOME}</style>', f'<title>Index of /{ONLINE_PATH.replace(f"{SEP}", "/")}</title>', '</head>', '<body>', f'<h1 align="center">Index of /{ONLINE_PATH.replace(f"{SEP}", "/")}</h1>', '<br>', '<ul>', '[<a class="home pdbtm" href="/">HOME</a>]<br>', f'[<a class="home pdbtm" href="/{xyz}"> .. </a>]<br>']
app.config["ABS_PATH"] = f'C:{SEP}Users{SEP}{getuser()}{SEP}Documents{SEP}webserver{SEP}online{SEP}{ONLINE_PATH}'
list_of_files = os.listdir(app.config["ABS_PATH"])
dirs, files = process_all(app.config["ABS_PATH"], list_of_files)
index_file = process_html(dirs, files)
index_comp = [index_def1, index_file, index_def2]
index = [item for sublist in index_comp for item in sublist]
return ''.join(index)
### END ###
app.run(host='0.0.0.0', port=80, debug=True)
任何人都可以帮助我解决这些错误,或者只是改进我的代码吗?谢谢
这需要做很多工作。这种状态没法回答问题,但是可以给你一些提示:
- 不要 从字符串生成 HTML。改为使用模板:https://flask.palletsprojects.com/en/1.1.x/tutorial/templates/
- 模板参数是你的朋友。您可以将文件作为列表存储在当前目录中。或者更好的是,为路径创建抽象,并给出这些路径的列表。
- 这也将允许您删除所有这些随机 CSS 文件。
- 不要使用
global
。 Python 几乎不需要它们。
pathlib
比 os.path
更能帮到你:https://docs.python.org/3/library/pathlib.html
- 您不需要 2 条路线。你只需要一个
/<path>
。如果它是空白加载根目录,否则加载该路径中的任何内容。
- 我不知道为什么会有
while
循环。你绝对不需要它。
- 确保处理目录遍历攻击,这样你就不会高于根目录:https://www.wikiwand.com/en/Directory_traversal_attack
或许可以按照有关如何创建 Flask 应用程序的指南进行操作。这个很好:https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world
您不必一直遵循它。
祝你好运!有下一个版本时,请随时再次 post。
我最近制作了一个代码,它像 Apache 服务器一样工作,没有任何 index.html
问题是我的代码确实有问题,我得到了不同的错误(这就是为什么 我没写在标题里)
下面是我的作品照片
结构照片(位于C:\Users\YourUsername\Documents\webserver\
)
正如我之前所说,我得到了不同的错误:
- 当进入两个或更深的文件夹,然后尝试使用浏览器箭头返回,然后单击任何 file/folder 我得到
FileNotFoundError
- 当进入两个或更深的文件夹然后尝试使用 'up folder' 按钮 (
[ .. ]
) 时,我得到了abort(404)
.CSS
文件的语法有点特殊,但内容很标准CSS
{
color: black;
}
现在我们有了主要代码,webserver.py
# -*- coding: utf-8 -*-
from flask import Flask, redirect, url_for, send_from_directory
from getpass import getuser
import os
### VARS ###
app = Flask('__main__')
SEP = os.sep
FOLDER_HOME = f'C:{SEP}Users{SEP}{getuser()}{SEP}Documents{SEP}webserver{SEP}'
FOLDER_STYLE = f'{FOLDER_HOME}styles{SEP}'
ONLINE_PATH = f''
app.config["ABS_PATH"] = f'C:{SEP}Users{SEP}{getuser()}{SEP}Documents{SEP}webserver{SEP}online{SEP}'
with open(f'{FOLDER_STYLE}STYLE_HTML.css', 'r', encoding='utf-8') as file: STYLE = " ".join(''.join(file.readlines()).split())
with open(f'{FOLDER_STYLE}STYLE_A.css', 'r', encoding='utf-8') as file: STYLE_A = " ".join(''.join(file.readlines()).split())
with open(f'{FOLDER_STYLE}STYLE_CLASS_ERROR.css', 'r', encoding='utf-8') as file: STYLE_ERROR = " ".join(''.join(file.readlines()).split())
with open(f'{FOLDER_STYLE}STYLE_CLASS_PDBTM.css', 'r', encoding='utf-8') as file: STYLE_PADDING_BOTTOM = " ".join(''.join(file.readlines()).split())
with open(f'{FOLDER_STYLE}STYLE_CLASS_HOME.css', 'r', encoding='utf-8') as file: STYLE_CLASS_HOME = " ".join(''.join(file.readlines()).split())
index_def1 = ['<!DOCTYPE html>', '<html>', '<head>', '<meta charset="utf-8">', f'<style type="text/css">html{STYLE} a{STYLE_A} .error{STYLE_ERROR} .pdbtm{STYLE_PADDING_BOTTOM} .home{STYLE_CLASS_HOME}</style>', f'<title>Index of /{ONLINE_PATH.replace(f"{SEP}", "/")}</title>', '</head>', '<body>', f'<h1 align="center">Index of /{ONLINE_PATH.replace(f"{SEP}", "/")}</h1>', '<br>', '<ul>', '[<a class="home pdbtm" href="/">HOME</a>]<br>', f'[<a class="home pdbtm" href="/{ONLINE_PATH}"> .. </a>]<br>']
index_file = []
index_def2 = ['</ul>', '</body>', '</html>']
### END ###
### FUNCTIONS ###
def process_html(dirs_list, files_list):
body = []
body.append('<br> --- Directorys --- </br>')
if dirs_list == []: body.append('<h2 class="error">No dirs found</h2>')
else:
for dirs in dirs_list:
body.append(f'<li class="pdbtm"><a href="/{dirs}">{dirs}/</a></li>')
body.append('<br> --- Files --- </br>')
if files_list == []: body.append('<h2 class="error">No files found</h2>')
else:
for files in files_list:
body.append(f'<li class="pdbtm"><a href="{files}">{files}</a></li>')
return body
def process_all(path, listed_directory):
dirs = []
files = []
for item in listed_directory:
if os.path.isfile(f'{path}{item}') == True: files.append(item)
else: dirs.append(item)
return dirs, files
### END ###
### ROUTES ###
@app.route('/')
def main():
global index_file
global ONLINE_PATH
global index_def1
ONLINE_PATH = ''
index_def1 = ['<!DOCTYPE html>', '<html>', '<head>', '<meta charset="utf-8">', f'<style type="text/css">html{STYLE} a{STYLE_A} .error{STYLE_ERROR} .pdbtm{STYLE_PADDING_BOTTOM} .home{STYLE_CLASS_HOME}</style>', f'<title>Index of /{ONLINE_PATH.replace(f"{SEP}", "/")}</title>', '</head>', '<body>', f'<h1 align="center">Index of /{ONLINE_PATH.replace(f"{SEP}", "/")}</h1>', '<br>', '<ul>', '[<a class="home pdbtm" href="/">HOME</a>]<br>', f'[<a class="home pdbtm" href="/{ONLINE_PATH}"> .. </a>]<br>']
app.config["ABS_PATH"] = f'C:{SEP}Users{SEP}{getuser()}{SEP}Documents{SEP}webserver{SEP}online{SEP}'
list_of_files = os.listdir(app.config["ABS_PATH"])
dirs, files = process_all(app.config["ABS_PATH"], list_of_files)
index_file = process_html(dirs, files)
index_comp = [index_def1, index_file, index_def2]
index = [item for sublist in index_comp for item in sublist]
return ''.join(index)
@app.route("/<path>")
def get_file(path):
while True:
try:
return send_from_directory(app.config["ABS_PATH"], filename=path, as_attachment=True)
except:
global index_file
global ONLINE_PATH
global index_def1
if path not in ONLINE_PATH: ONLINE_PATH += f'{path}{SEP}'
else: ONLINE_PATH = f'{path}{SEP}'
xyz = ONLINE_PATH.replace(path, '')
xyz = xyz[:-1]
xyz = ''.join(xyz)
index_def1 = ['<!DOCTYPE html>', '<html>', '<head>', '<meta charset="utf-8">', f'<style type="text/css">html{STYLE} a{STYLE_A} .error{STYLE_ERROR} .pdbtm{STYLE_PADDING_BOTTOM} .home{STYLE_CLASS_HOME}</style>', f'<title>Index of /{ONLINE_PATH.replace(f"{SEP}", "/")}</title>', '</head>', '<body>', f'<h1 align="center">Index of /{ONLINE_PATH.replace(f"{SEP}", "/")}</h1>', '<br>', '<ul>', '[<a class="home pdbtm" href="/">HOME</a>]<br>', f'[<a class="home pdbtm" href="/{xyz}"> .. </a>]<br>']
app.config["ABS_PATH"] = f'C:{SEP}Users{SEP}{getuser()}{SEP}Documents{SEP}webserver{SEP}online{SEP}{ONLINE_PATH}'
list_of_files = os.listdir(app.config["ABS_PATH"])
dirs, files = process_all(app.config["ABS_PATH"], list_of_files)
index_file = process_html(dirs, files)
index_comp = [index_def1, index_file, index_def2]
index = [item for sublist in index_comp for item in sublist]
return ''.join(index)
### END ###
app.run(host='0.0.0.0', port=80, debug=True)
任何人都可以帮助我解决这些错误,或者只是改进我的代码吗?谢谢
这需要做很多工作。这种状态没法回答问题,但是可以给你一些提示:
- 不要 从字符串生成 HTML。改为使用模板:https://flask.palletsprojects.com/en/1.1.x/tutorial/templates/
- 模板参数是你的朋友。您可以将文件作为列表存储在当前目录中。或者更好的是,为路径创建抽象,并给出这些路径的列表。
- 这也将允许您删除所有这些随机 CSS 文件。
- 不要使用
global
。 Python 几乎不需要它们。 pathlib
比os.path
更能帮到你:https://docs.python.org/3/library/pathlib.html- 您不需要 2 条路线。你只需要一个
/<path>
。如果它是空白加载根目录,否则加载该路径中的任何内容。- 我不知道为什么会有
while
循环。你绝对不需要它。 - 确保处理目录遍历攻击,这样你就不会高于根目录:https://www.wikiwand.com/en/Directory_traversal_attack
- 我不知道为什么会有
或许可以按照有关如何创建 Flask 应用程序的指南进行操作。这个很好:https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world
您不必一直遵循它。
祝你好运!有下一个版本时,请随时再次 post。