Azure Functions Python自定义路由配置不生效问题咨询
Azure Functions Python自定义路由配置不生效问题咨询
嗨,我来帮你分析下这个问题~你遇到的情况是因为混合了Azure Functions的V1和V2两种编程模型的配置方式,导致你用@app.route设置的自定义路由没生效,反而默认用了文件夹名作为路由。
具体来说,你现在的代码里用了V2模型的func.FunctionApp()和@app.route装饰器,但同时又保留了V1模型里的function.json绑定配置——而Functions运行时会优先读取function.json里的httpTrigger设置,直接忽略了装饰器里的路由规则,所以才会出现不符合预期的URL。
下面给你两种解决思路,选一种适合你的就行:
方法一:切换到纯V2编程模型(推荐)
V2模型用装饰器就能搞定所有路由和绑定配置,不用手动维护function.json的绑定部分,更简洁。步骤如下:
- 修改你的
function.json,只保留scriptFile字段,删掉整个bindings数组,修改后内容如下:
{ "scriptFile": "__init__.py" }
- 调整你的代码,把路由、权限、请求方法都通过装饰器配置,同时确保入口函数被装饰器覆盖(可以把main函数的逻辑整合进去,或者继续调用main):
import logging import azure.functions as func # 初始化FunctionApp实例 app = func.FunctionApp() # 用装饰器定义路由、权限和支持的请求方法 @app.route(route="/search/testing", auth_level=func.AuthLevel.FUNCTION, methods=["get", "post"]) def get_customers_by_filters(req: func.HttpRequest) -> func.HttpResponse: logging.info('Python HTTP trigger function processed a request.') # 这里可以直接写逻辑,或者调用你的main函数 return func.HttpResponse(f"Hello world", status_code=200)
- 重新运行
func start,此时访问的URL就会是http://localhost:3000/api/search/testing啦(V2模型默认会在路由前加/api前缀,如果想去掉可以修改host.json里的routePrefix配置)
方法二:保留V1模型(通过function.json配置路由)
如果你不想切换模型,继续用function.json来管理绑定,那就在httpTrigger的配置里直接添加route字段:
- 修改你的
function.json,在httpTrigger绑定里加上"route": "search/testing":
{ "scriptFile": "__init__.py", "bindings": [ { "authLevel": "function", "type": "httpTrigger", "direction": "in", "name": "req", "methods": [ "get", "post" ], "route": "search/testing" }, { "type": "http", "direction": "out", "name": "$return" } ] }
- 删掉代码里的
app = func.FunctionApp()和@app.route装饰器部分,因为V1模型不需要这些:
import logging import azure.functions as func def main(req: func.HttpRequest) -> func.HttpResponse: logging.info('Python HTTP trigger function processed a request.') return func.HttpResponse(f"Hello world", status_code=200)
- 重新启动
func start,此时URL就会变成你想要的http://localhost:3000/api/search/testing了
备注:内容来源于stack exchange,提问作者OK 400
相关产品推荐
相关产品推荐

