Python Flask在PyTube Youtube下载应用程序中抛出JSON序列化错误
信息: 我正在使用模块PyTube(3)构建一个Youtube下载Web应用程序。 它是以烧瓶为基础的 额外文件的工作: 使用Python Flask在PyTube Youtube下载应用程序中抛出JSON序列化错误,python,json,flask,youtube,pytube,Python,Json,Flask,Youtube,Pytube,信息: 我正在使用模块PyTube(3)构建一个Youtube下载Web应用程序。 它是以烧瓶为基础的 额外文件的工作: 使用YouTubeDownload.py文件,因此在app.py文件中,所有内容都是干净的。 用于清理不需要的数据 工作原理: 首先在索引中呈现一个HTML页面,该页面包含一个带有URL输入表单的表单,该表单将其提交给“/details”。 onsubmit函数运行以显示正在加载的gif 然后,url被传递到yt对象,该对象由YouTubeDownload.py中的You
YouTubeDownload.py
文件,因此在app.py
文件中,所有内容都是干净的。
用于清理不需要的数据
工作原理:
首先在索引中呈现一个HTML页面,该页面包含一个带有URL输入表单的表单,该表单将其提交给“/details”。
onsubmit函数运行以显示正在加载的gif
然后,url被传递到yt对象,该对象由YouTubeDownload.py中的YoutubeVideo初始化
然后使用try,除了不同的异常之外,它使用带有流id的JINJA将可供下载的流列表传递到HTML页面
然后将流id设置为“下载/-流的id”。e、 g.“下载/5”
因此,调用“/download/”,它从url获取流id,然后根据id下载流,并在下载完成时运行称为redirectUser的函数
redirect user函数将bool作为str和下载的视频/音频文件名传递到HTML页面(脚本标记内),然后将用户重定向到“/download/f/-The-file-name-from js”
然后,donwload/f/filename使用flask的render_from_目录从dir返回文件
注意:我已经使许多变量成为全局变量,因此我可以从不同的函数访问它们
错误:
我得到了完全脱离上下文的JSON类型错误,因为我没有使用它,似乎在任何模块中都存在一些问题
我还提到了下面的错误
app.py
从flask导入flask、请求、呈现\u模板、从\u目录发送\u、响应、重定向、闪存
从YoutubeDownload导入YoutubeVideo
从线程导入计时器
从日期时间导入日期时间
导入操作系统
导入系统
#烧瓶应用程序初始化
app=烧瓶(“名称”)
#应用程序配置
app.secret_key='-secret key-'
#全局变量
yt=“”
url=“”
streams=“”
下载_文件_name=“”
#请求变量
isAudio=假
延迟(单位:秒)=5
downloadStatus=False
YOUTUBE\u FILES=“YOUTUBE\u FILES”
#从目录中删除下载的文件
def removeFile(文件名):
删除(os.path.join(YOUTUBE_文件,文件名))
#将重定向状态下载为True并运行删除文件功能
def重定向用户(流、文件路径):
全局下载状态,下载文件名,isAudio
downloadStatus=True
下载\u file\u name=os.path.basename(文件路径)
如果是音频:
下载文件名=os.path.splitext(下载文件名)[0]+“.mp3”
音频文件路径=os.path.join(YOUTUBE文件,下载文件名)
重命名(文件路径、音频文件路径)
线程=计时器(延迟秒,删除文件,[下载文件名])
thread.start()
#从文件名获取文件扩展名
def get_文件扩展名(文件名):
如果文件名中没有“.”:
返回错误
返回文件名.rsplit(“.”,1)[1].upper()
#检查请求是音频还是视频
def checkFileRequest(流,流id):
对于范围内的i(len(streams)):
如果str(streams[i][0])==str(stream\u id):
如果str(流[i][3])中的“音频”:
返回真值
其他:
返回错误
#网站的索引url
@app.route(“/”,methods=[“GET”])
@应用程序路径(“/索引”)
def index():
返回渲染模板(“index.html”)
#有关表单POST请求和显示流的详细信息
@app.route(“/details”,methods=[“POST”])
def details():
如果request.method==“POST”:
尝试:
yturl=request.form.get(“url”)
除AttributeError外,其他属性为:
返回重定向(“/”,404)
全球yt,溪流
尝试:
yt=YoutubeVideo(yturl)
除:
错误=sys.exc_info()
如果str(sys.exc_info()[1])中的“get_ytplayer_config”:
flash(“输入有效的视频url!”)
返回重定向(“/”)
str(sys.exc_info()[1])中的elif“getaddrinfo失败”:
网络=错误
flash(“无法获取数据。请检查您的internet连接”,“危险”)
返回重定向(“/”)
其他:
闪光(错误,“危险”)
重定向(“/”)
尝试:
streams=yt.get_streams()
details=yt.get_details()
除属性错误为e外:
flash(“输入有效的youtube url!”)
返回重定向(“/”)
返回呈现模板('details.html',streams=streams,details=details)
其他:
返回重定向(“/”)
#在使用流id访问时,它将重定向以从dir发送
@app.route(“/download/”,方法=[“GET”])
def下载(流id):
全局yt、下载状态、下载文件名、流、isAudio
isAudio=checkFileRequest(流,流\u id)
尝试:
yt.下载完成(重定向用户)
下载(流id、YOUTUBE文件)
除属性错误为e外:
flash(“出现问题,请重试!”)
返回重定向(“/”)
返回渲染模板(“download.html”,downloadStatus=downloadStatus,fileName=download\u file\u name)
#从dir发送文件
@app.route(“/download/f/”,方法=[“GET”])
def returnFile(文件名):
从目录返回发送(YOUTUBE\u文件,文件名,as\u attachment=True)
@app.errorhandler(404)
def pagenotFound(错误):
返回渲染模板(“404.html”)
@app.errorhandler(405)
不允许使用def方法(错误):
返回渲染模板(“405.html”)
如果名称=“\uuuuu main\uuuuuuuu”:
运行(调试=True,端口=5001)
以下是错误日志:
Traceback (most recent call last):
File "F:\Youtube Do\venv\lib\site-packages\flask\app.py", line 2464, in __call__
return self.wsgi_app(environ, start_response)
File "F:\Youtube Do\venv\lib\site-packages\flask\app.py", line 2450, in wsgi_app
response = self.handle_exception(e)
File "F:\Youtube Do\venv\lib\site-packages\flask\app.py", line 1867, in handle_exception
reraise(exc_type, exc_value, tb)
File "F:\Youtube Do\venv\lib\site-packages\flask\_compat.py", line 39, in reraise
raise value
File "F:\Youtube Do\venv\lib\site-packages\flask\app.py", line 2447, in wsgi_app
response = self.full_dispatch_request()
File "F:\Youtube Do\venv\lib\site-packages\flask\app.py", line 1953, in full_dispatch_request
return self.finalize_request(rv)
File "F:\Youtube Do\venv\lib\site-packages\flask\app.py", line 1970, in finalize_request
response = self.process_response(response)
File "F:\Youtube Do\venv\lib\site-packages\flask\app.py", line 2269, in process_response
self.session_interface.save_session(self, ctx.session, response)
File "F:\Youtube Do\venv\lib\site-packages\flask\sessions.py", line 378, in save_session
val = self.get_signing_serializer(app).dumps(dict(session))
File "F:\Youtube Do\venv\lib\site-packages\itsdangerous\serializer.py", line 166, in dumps
payload = want_bytes(self.dump_payload(obj))
File "F:\Youtube Do\venv\lib\site-packages\itsdangerous\url_safe.py", line 42, in dump_payload
json = super(URLSafeSerializerMixin, self).dump_payload(obj)
File "F:\Youtube Do\venv\lib\site-packages\itsdangerous\serializer.py", line 133, in dump_payload
return want_bytes(self.serializer.dumps(obj, **self.serializer_kwargs))
File "F:\Youtube Do\venv\lib\site-packages\flask\json\tag.py", line 305, in dumps
return dumps(self.tag(value), separators=(",", ":"))
File "F:\Youtube Do\venv\lib\site-packages\flask\json\__init__.py", line 211, in dumps
rv = _json.dumps(obj, **kwargs)
File "c:\users\sohel\appdata\local\programs\python\python37\lib\json\__init__.py", line 238, in dumps
**kw).encode(obj)
File "c:\users\sohel\appdata\local\programs\python\python37\lib\json\encoder.py", line 199, in encode
chunks = self.iterencode(o, _one_shot=True)
File "c:\users\sohel\appdata\local\programs\python\python37\lib\json\encoder.py", line 257, in iterencode
return _iterencode(o, 0)
File "F:\Youtube Do\venv\lib\site-packages\flask\json\__init__.py", line 100, in default
return _json.JSONEncoder.default(self, o)
File "c:\users\sohel\appdata\local\programs\python\python37\lib\json\encoder.py", line 179, in default
raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type type is not JSON serializable
YoutubeDownload.py
从pytube导入YouTube
导入请求
类YoutubeVideo():
定义初始化(self,url):
self.url=url
self.Video=YouTube(url)
self.streams=self.Video.st