Phoenix Framework websocket,在运行时设置check_origin
我使用exrm作为发布管理器 我在prod.exs中添加了一个配置,以便在运行时检索环境变量“check\u origin”Phoenix Framework websocket,在运行时设置check_origin,websocket,elixir,phoenix-framework,Websocket,Elixir,Phoenix Framework,我使用exrm作为发布管理器 我在prod.exs中添加了一个配置,以便在运行时检索环境变量“check\u origin” config :my_app, check_origin: "${CHECK_ORIGIN}" 问题在于,websocket在编译时配置为 transport :websocket, Phoenix.Transports.WebSocket 所以我不能这样做: transport :websocket, Phoenix.Transports.WebSocket, ch
config :my_app, check_origin: "${CHECK_ORIGIN}"
问题在于,websocket在编译时配置为
transport :websocket, Phoenix.Transports.WebSocket
所以我不能这样做:
transport :websocket, Phoenix.Transports.WebSocket, check_origin: Application.get_env(:my_app, :check_origin) |> Poison.decode!
有人知道我如何在运行时配置websocket的传输,以便使用环境变量(这是一个编码的json)吗
编辑:
以下是我已经尝试过的:
def start(_type, _args) do
import Supervisor.Spec, warn: false
c_o = ((Application.get_env(:my_app, :check_origin) || "true") |> Poison.decode!)
Application.put_env(:my_app, MyApp.Endpoint, Application.get_env(:my_app, MyApp.Endpoint) ++ [check_origin: c_o])
......
以下方面应起作用: 首先,跳过
传输
行中的检查原点
:
transport :websocket, Phoenix.Transports.WebSocket
然后,在端点模块的init/2
函数中,在开头添加以下内容:
config = Keyword.put(
config,
:check_origin,
Application.get_env(:my_app, :check_origin) |> Poison.decode!
)
在全新的Phoenix 1.3应用程序中,我发现:
iex(1)> FooWeb.Endpoint.config :check_origin
false
将以下内容添加到init/2
之后:
config = Keyword.put(config, :check_origin, true)
我得到:
iex(1)> FooWeb.Endpoint.config :check_origin
true
根据,如果在传输的配置中找不到
check\u origin
,则原点检查应返回到此配置变量。尽管如此,请告诉我它是否有效,我还没有测试功能。我认为蒸馏厂有REPLACE\u OS\u VARS=true
env-var,您可以设置,它将在启动时替换配置中的env-var。我试着在exrm中寻找类似的东西,我能看到的只有这里(似乎被称为RELX\u REPLACE\u OS\u VARS
):是的,在启动时。。。我的问题是websocket的传输设置在编译时…实际上,我已经尝试过了。。。正在使用Application.put_env:my_app Endpoint config。。。它似乎不会回退到端点检查原点,尽管检查原点在端点配置中正确设置为。。。或者我错过了什么,我会在编辑中重新尝试,这是我已经尝试过的。。。似乎是相同的想法,但不起作用:-(如果我在端点的init中这样做,它会改变什么吗?它应该会改变。你的代码的问题是对transport
的调用是在编译时计算的。init/2
不过是在引导时改变配置的。嗯,在phoenix v1.3上是init/2
吗?我在1.2.4中似乎没有这个功能。)