使用HTTP.serve启动http服务器时,显然无法重新加载实际上正在处理HTTP请求的代码。 在下面的示例中,我希望在my_httphandler中进行修改,而不必重新启动服务器。 目前,我需要通过两次按CTRL + C来从REPL停止服务器,然后再次运行脚本。
有解决方法吗?
module MyModule
using HTTP
using Mux
using JSON
using Sockets
function my_httphandler(req::HTTP.Request)
return HTTP.Response(200, "Hello world")
end
const MY_ROUTER = HTTP.Router()
HTTP.@register(MY_ROUTER, "GET", "/*", my_httphandler)
HTTP.serve(MY_ROUTER, Sockets.localhost, 8081)
end
答案 0 :(得分:0)
我不确定Mux是否缓存处理程序。只要不行,就应该起作用:
module MyModule
using HTTP
using Mux
using JSON
using Sockets
function my_httphandler(req::HTTP.Request)
return HTTP.Response(200, "Hello world")
end
const functionref = Any[my_httphandler]
const MY_ROUTER = HTTP.Router()
HTTP.@register(MY_ROUTER, "GET", "/*", functionref[1])
HTTP.serve(MY_ROUTER, Sockets.localhost, 8081)
end
function newhandler(req::HTTP.Request)
return HTTP.Response(200, "Hello world 2")
end
MyModule.functionref[1] = newhandler
答案 1 :(得分:0)
Revise.jl使您可以在实时Julia会话中自动更新代码。您可能对entr
尤其感兴趣;有关详细信息,请参见Revise的文档。
答案 2 :(得分:0)
使用HTTP.jl时:只需在HTTP.serve之前添加@async
module MyModule
using HTTP
using Sockets
function my_httphandler(req::HTTP.Request)
return HTTP.Response(200, "Hello world")
end
const MY_ROUTER = HTTP.Router()
HTTP.@register(MY_ROUTER, "GET", "/*", my_httphandler)
@async HTTP.serve(MY_ROUTER, Sockets.localhost, 8081)
end # module
使用Mux.jl时:无事可做,服务器在后台启动
using Mux
function sayhellotome(name)
return("hello " * name * "!!!")
end
@app test = (
Mux.defaults,
route("/sayhello/:user", req -> begin
sayhellotome(req[:params][:user])
end),
Mux.notfound())
Mux.serve(test, 8082)
答案 3 :(得分:0)
我已经为HTTP.jl项目添加了票证#587,以支持开发人员工作流。我不确定这是否是您的用例。
# hello.jl -- an example showing how Revise.jl works with HTTP.jl
# julia> using Revise; includet("hello.jl"); serve();
using HTTP
using Sockets
homepage(req::HTTP.Request) =
HTTP.Response(200, "<html><body>Hello World!</body></html>")
const ROUTER = HTTP.Router()
HTTP.@register(ROUTER, "GET", "/", homepage)
serve() = HTTP.listen(request -> begin
Revise.revise()
Base.invokelatest(HTTP.handle, ROUTER, request)
end, Sockets.localhost, 8080, verbose=true)
或者,您可能有一个test/serve.jl
文件,该文件假定具有顶级MyModule
路由器的HTTP.jl
被称为ROUTER
。您需要在主模块中删除对serve
的调用。
#!/usr/bin/env julia
using HTTP
using Sockets
using Revise
using MyModule: ROUTER
HTTP.listen(request -> begin
Revise.revise()
Base.invokelatest(HTTP.handle, ROUTER, request)
end, Sockets.localhost, 8080, verbose=true)
更强大的解决方案将捕获错误;但是,在使它起作用方面我遇到了挑战,并在Revise.jl
的{{3}}上报告了我的经验。