【问题标题】:Phoenix Framework websocket, setting check_origin at runtimePhoenix Framework websocket,在运行时设置check_origin
【发布时间】:2017-11-23 00:15:56
【问题描述】:

我使用 exrm 作为发布管理器

我在 prod.exs 中添加了一个配置,因此我可以在运行时检索环境变量“check_origin”

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])  
......

【问题讨论】:

  • 我认为 Distillery 有 REPLACE_OS_VARS=true 可以设置的环境变量,它将在启动时替换配置中的环境变量。我尝试在 exrm 中寻找类似的东西,我能看到的都在这里(似乎被称为RELX_REPLACE_OS_VARS):github.com/bitwalker/exrm/blob/…
  • 是的,在启动时...我的问题是 websocket 的传输设置是在编译时...

标签: websocket elixir phoenix-framework


【解决方案1】:

以下应该有效:

首先,跳过transport 行中的check_origin

transport :websocket, Phoenix.Transports.WebSocket

然后,在 Endpoint 模块的 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

根据source code,如果在传输配置中找不到check_origin,则原点检查应退回到此配置变量。让我知道它是否有效,我还没有测试过这个功能。

【讨论】:

  • 实际上,我已经尝试过了...在 :my_app Endpoint config 中使用 Application.put_env ... 尽管 check_origin 在 Endpoint 中正确设置,但它似乎并没有回退到 Endpoint check_origin之后配置......或者我错过了什么,我会重试只是为了我的想法
  • 在我的编辑中,是我已经尝试过的......似乎是相同的想法,但不起作用:-(
  • 如果我在端点的初始化中这样做会改变什么吗?
  • 应该的。您的代码的问题是对 transport 的调用是在编译时评估的。 init/2 但是是为了在启动时更改配置。
  • 嗯,init/2 在 phoenix v1.3 上吗?我在 1.2.4 中似乎没有这个
猜你喜欢
  • 2019-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-09
  • 2016-04-09
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
相关资源
最近更新 更多