Sanic服务启动失败,报错Cannot finalize with no routes defined

Sanic服务启动失败,记录解决方法

问题描述

Sanic服务启动失败,同样的代码和python版本在之前的win10系统上运行的好好的,换了台win11的机器就跑不起来了,不知道是系统原因还是因为换了执行pycharm等其他原因

在尝试启动时总是会报类似如下的错误:

sanic_routing.exceptions.FinalizationError: Cannot finalize with no routes defined.
sys:1: RuntimeWarning: coroutine ‘BaseEventLoop.create_server’ was never awaited

报错部分截图:
在这里插入图片描述
运行环境:

  • win11
  • pycharm
  • python3.9

运行方式:

  • debug方式或普通右键方式运行

尝试找到原因并解决

发现的表象原因:
sanic服务注册路由时放在了函数中执行会导致路由在app启动时还没有注册,从而导致启动失败
sanic关闭服务时也会检测是否注册路由,如果没有路由就会报上面提到的错误:Cannot finalize with no routes defined.
例如下图中的

# -*- coding:utf-8 -*-
from sanic import response, Sanic
from sanic.views import HTTPMethodViewapp = Sanic("abc")class NameTest(HTTPMethodView):@classmethodasync def post(cls, request):print(cls.post.__name__)return response.text("test")def register_route():# 注册路由放到了方法中,如果用这种方式,会导致启动失败app.add_route(NameTest.as_view(), "/test")if __name__ == '__main__':register_route()app.run()

可以正确启动的方式:
是把注册路由相关的方法(blueprint、add_router这些)放到app所在的全局处理:

# -*- coding:utf-8 -*-
from sanic import response, Sanic
from sanic.views import HTTPMethodViewapp = Sanic("abc")class NameTest(HTTPMethodView):@classmethodasync def post(cls, request):print(cls.post.__name__)return response.text("test")# 注册路由放在了全局执行
app.add_route(NameTest.as_view(), "/test")if __name__ == '__main__':app.run()

找到了表象原因,代码不多可以通过将注册路由的时机放到全局启动时来解决这个问题
但是如果是在工作项目中,已经写好了大部分的的路由注册方式(而且大概率会在方法中执行路由注册)

更新,根本原因及解决方法

在sanic github的一个issue找到的部分原因和线索:
对app的任何操作(例如,注册路由/创建蓝图/更新配置等)都必须在if __name__ == '__main__'之前完成,在if __name__ == '__main__'对app的操作只能时app.run

因此解决办法就是把app.run的其他操作都在if __name__ == '__main__'之前做完即可
例如,在if __name__ == '__main__'之前先运行路由注册

# -*- coding:utf-8 -*-
# -*- coding:utf-8 -*-
from sanic import response, Sanic
from sanic.views import HTTPMethodViewapp = Sanic("abc")class NameTest(HTTPMethodView):@classmethodasync def post(cls, request):print(cls.post.__name__)return response.text("test")def register_route():app.add_route(NameTest.as_view(), "/test")register_route()if __name__ == '__main__':app.run()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/469378.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

打一波鸡血

在朋友圈看的一首诗,觉得很励志,如下:问题在于过度担心未来总是埋怨现在不断惋惜过往内心不知足想法逾现实行动很迟缓时间可贵青春难再审视脚下的路充实度日一日尚短庸碌混迹一日便长无妄的借口只会难上加难脚踏实地走才能遇难成祥守住时光用…

【Pytorch神经网络理论篇】 12 卷积神经网络实现+卷积计算的图解

同学你好!本文章于2021年末编写,获得广泛的好评! 故在2022年末对本系列进行填充与更新,欢迎大家订阅最新的专栏,获取基于Pytorch1.10版本的理论代码(2023版)实现, Pytorch深度学习理论篇(2023版)目录地址…

vim 函数列表插件

1.apt-get install exuberant-ctags 2.unzip taglist_42.zip  把解压出来的文件放到 /home/weiqifa(自己的用户名)/.vim/  资源下载: http://download.csdn.net/detail/weiqifa0/91372833.s…

【Pytorch神经网络实战案例】09 使用卷积提取图片的轮廓信息(手动模拟Sobel算子)

1 载入图片并显示 import matplotlib.pyplot as plt import matplotlib.image as mpimg import torch import torchvision.transforms as transforms import os os.environ["KMP_DUPLICATE_LIB_OK"]"TRUE" ### 1 载入图片并显示 myimg mpimg.imread(img.…

jquery深入学习

的转载于:https://www.cnblogs.com/lizhiwei8/p/6417798.html

【Pytorch神经网络理论篇】 13 深层卷积神经网络介绍+池化操作+深层卷积神经网络实战

同学你好!本文章于2021年末编写,获得广泛的好评! 故在2022年末对本系列进行填充与更新,欢迎大家订阅最新的专栏,获取基于Pytorch1.10版本的理论代码(2023版)实现, Pytorch深度学习理论篇(2023版)目录地址…

gulp 系统教程

移步: http://www.cnblogs.com/2050/p/4198792.html gulp外挂 加md5 版本号 自动合并图片并修改css的坐标 一个系统列子 gulp可以做哪些事情转载于:https://www.cnblogs.com/dhsz/p/6419383.html

Android 广播接收

问题:写了一个应用来验证我按下音量键时发送出来的广播,可是老是提示出错, 原因:我的整个应用只继承吧BroadcastReceive,没有实际的继承Activity所以总是出现各种问题,现在修改好,上传代码 http…

【Pytorch神经网络实战案例】10 搭建深度卷积神经网络

识别黑白图中的服装图案(Fashion-MNIST)https://blog.csdn.net/qq_39237205/article/details/123379997基于上述代码修改模型的组成 1 修改myConNet模型 1.1.1 修改阐述 将模型中的两个全连接层,变为全局平均池化层。 1.1.2 修改结果 ### 1.5 定义模型类 class m…

Service Worker,Web Worker,WebSocket的对比

Service Worker 处理网络请求的后台服务。适用于离线和后台同步数据或推送信息。不能直接和dom交互。通过postMessage方法交互。 Web Worker 模拟多线程,允许复杂计算功能的脚本在后台运行而不会阻碍到其他脚本的运行。适用于处理器占用量大而又不阻碍的情形。不能直…

MTK 升级USB问题

问题:我们的开发环境是ubuntu里面安装xp ,经常是xp下没有正常识别preload模式下的usb.这样肯定不能升级不了。 设置:MTK preload下的USB vid:0e8d pid:2000 revion 0100 知道这几个值了,在usb配置里面增加这个筛选项就可以了。

JAVA 8 StreamAPI 和 lambda表达式 总结(一)--lambda表达式

这些天看见另一本好书《给大忙人看的Java SE 8》,其中的新特性 StreamAPI 和 lambda表达式 是之前jdk没有提供的新特性,也是jdk8 重要的更新内容,我会总结一下它们的用法,更详细的参见书本。 lambda表达式的概念 人对一个概念的理…

【Pytorch神经网络理论篇】 14 过拟合问题的优化技巧(一):基本概念+正则化+数据增大

同学你好!本文章于2021年末编写,获得广泛的好评! 故在2022年末对本系列进行填充与更新,欢迎大家订阅最新的专栏,获取基于Pytorch1.10版本的理论代码(2023版)实现, Pytorch深度学习理论篇(2023版)目录地址…

MTK 8127平台使用busybox

一、什么是BusyBox ? BusyBox 是标准 Linux 工具的一个单个可执行实现。BusyBox 包含了一些简单的工具,例如 cat 和 echo,还包含了一些更大、更复杂的工具,例如 grep、find、mount 以及 telnet。有些人将 BusyBox 称为 Linux 工具…

MediaPlayer 播放视频的方法

MediaPlayer mediaPlayer new MediaPlayer(); mediaPlayer.reset();//重置为初始状态 mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setDisplay(surfaceView.getHolder());//设置画面显示为surfaceView mediaPlayer.setDataSource("/mnt/sdc…

Android bootchart分析

1.首先确保编译的init被烧录到板子里面去了,源码的位置在system/core/init/ 2.第一次修改后,编译了system/core/init/然后又编译了./mkkernel 生成boot.img 但是烧录进去还是不成功 3.然后 发现有一个宏没有设置 在bootchart.h里面,BOOTCHART 修改后重新编译,烧了所有…

【Pytorch神经网络理论篇】 15 过拟合问题的优化技巧(二):Dropout()方法

同学你好!本文章于2021年末编写,获得广泛的好评! 故在2022年末对本系列进行填充与更新,欢迎大家订阅最新的专栏,获取基于Pytorch1.10版本的理论代码(2023版)实现, Pytorch深度学习理论篇(2023版)目录地址…

bzoj2435: [Noi2011]道路修建 树上dp

点击打开链接 RE了一辈子... 思路&#xff1a;树上dp&#xff0c;直接dfs找到每个点v的子节点有多少&#xff0c; 那么对答案的贡献是 w*abs((n-size[v])-size[v]); RE代码&#xff1a; 1 #include <bits/stdc.h>2 using namespace std;3 typedef long long ll;4 const i…

android之APP模块编译

原文地址&#xff1a;http://blog.csdn.net/yaphet__s/article/details/45640627 一&#xff0c;如何把app编进系统 a.源码编译&#xff0c;在packages/apps目录下有安卓原生的app&#xff0c;以Bluetooth为例&#xff0c;源码根目录下有Android.mk文件&#xff1a; packages\a…