标签: plug

Phoenix:如何在控制台中获得conn%Plug.Conn {}

iex -S mix phx.server
Run Code Online (Sandbox Code Playgroud)

我想在iex终端中做一些快速测试,但是有些函数需要struct%Plug.Conn {}作为参数,例如我想得到表达式的结果:

MyAppWeb.Router.Helpers.confirmation_url(%Plug.Conn{}, :edit, "12345")
Run Code Online (Sandbox Code Playgroud)

但我有错误:

Phoenix endpoint not found in %{}
Run Code Online (Sandbox Code Playgroud)

有一种简单的方法在控制台中获取conn结构吗?

terminal elixir phoenix-framework plug

7
推荐指数
2
解决办法
1231
查看次数

Elixir/Phoenix:如何实现会话超时/到期

我正在研究一个香草Elixir/Phoenix应用程序,并按照Programming Phoenix书中的一般步骤实现基本的登录和注销系统(参见下面的代码片段).但是我在书中或网上看不到有关如何设置基于cookie的插件会话在一定时间后过期的建议.Phoenix应用程序中的会话超时有哪些方法?

这是我的骨干auth系统的一些相关片段:

endpoint.ex,应用程序配置为使用只读的基于cookie的会话:

plug Plug.Session,
  store: :cookie,
  key: "_zb_key",
  signing_salt: "RANDOM HEX"
Run Code Online (Sandbox Code Playgroud)

我写了一个插件auth.ex(其中包括)可以登录经过身份验证的用户,并可以current_user根据user_id后续请求中找到的会话进行设置:

def login!(conn, user) do
  conn
    |> assign(:current_user, user)
    |> put_session(:user_id, user.id)
    |> configure_session(renew: true)
end

# ... more ...

def load_current_user(conn, _opts) do
  cond do
    conn.assigns[:current_user] ->
      conn # If :current_user was already set, honor it
    user_id = get_session(conn, :user_id) ->
      user = Zb.Repo.get!(Zb.User, user_id)
      assign(conn, :current_user, user)
    true ->
      conn # No user_id was found; …
Run Code Online (Sandbox Code Playgroud)

elixir phoenix-framework plug

6
推荐指数
3
解决办法
2714
查看次数

在Elixir中解析器之后,从插头连接中读取原始内容

我需要检查发送到phoenix服务器的JSON内容的摘要。要检查消化,需要生肉。有什么方法可以比解析器更晚地在管道中访问插件中的原始内容。我想将以下摘要验证插件添加到管道的末尾,但无法确定它如何访问已发送的原始内容。

  plug Plug.Parsers,
    parsers: [:urlencoded, :json],
    pass: ["*/*"],
    json_decoder: Poison

  plug Plug.MethodOverride
  plug Plug.Head
  plug Plug.VerifyDigest
Run Code Online (Sandbox Code Playgroud)

elixir phoenix-framework plug

5
推荐指数
2
解决办法
1407
查看次数

为什么将 HEAD 请求转换为 GET 请求有用?

在一个新的 Phoenix 应用程序中,Plug.Head插件默认存在,我对它的重要性很感兴趣。

我知道“ HEAD 方法与 GET 相同,只是服务器不得在响应中发送消息正文”。

我认为凤凰城官方指南是一流的,但这让我在路由指南中感到失望:

Plug.Head - 将 HEAD 请求转换为 GET 请求并剥离响应正文

如果 HEAD 请求没有正文,那么为什么需要这样做?我想也许可以控制格式错误的请求,但查看Plug.Head 实现,它只是将 HEAD 方法切换为 GET。

  def call(%Conn{method: "HEAD"} = conn, []), do: %{conn | method: "GET"}
  def call(conn, []), do: conn
end
Run Code Online (Sandbox Code Playgroud)

我能在这个主题上找到的最接近的事情是关于 ServerFault 的一个问题,但它与 NGINX 和有缺陷的应用程序逻辑有关,其中 HEAD 请求需要转换为 GET,并且相应的 GET 响应返回到 HEAD。

http endpoint phoenix-framework plug

5
推荐指数
1
解决办法
1179
查看次数

Phoenix开始抛出(UndefinedFunctionError)函数:crypto.rand_bytes/1未定义或私有

在更新到我的系统 - MAC之后,我的凤凰应用程序编译得很好但是在我遇到任何路由时都会抛出此错误.

服务器:localhost:4000(http)请求:GET/**(退出)引发异常:**(UndefinedFunctionError)函数:crypto.rand_bytes/1未定义或私有.你是说其中一个:

  * rand_seed/0
  * rand_seed/1

    (crypto) :crypto.rand_bytes(20)
    (plug) lib/plug/request_id.ex:59: Plug.RequestId.generate_request_id/0
    (plug) lib/plug/request_id.ex:48: Plug.RequestId.get_request_id/2
    (plug) lib/plug/request_id.ex:42: Plug.RequestId.call/2
    (olars) lib/olars/endpoint.ex:1: Olars.Endpoint.phoenix_pipeline/1
    (olars) lib/plug/debugger.ex:93: Olars.Endpoint."call (overridable 3)"/2
    (olars) lib/olars/endpoint.ex:1: Olars.Endpoint.call/2
    (plug) lib/plug/adapters/cowboy/handler.ex:15: Plug.Adapters.Cowboy.Handler.upgrade/4
    (cowboy) src/cowboy_protocol.erl:442: :cowboy_protocol.execute/4
Run Code Online (Sandbox Code Playgroud)

我的mix.exs

{:phoenix, "~> 1.2.0"},
      {:phoenix_pubsub, "~> 1.0"},
      {:phoenix_ecto, "~> 3.0"},
      {:phoenix_haml, github: "chrismccord/phoenix_haml"},
      {:mariaex, ">= 0.0.0"},
      {:phoenix_html, "~> 2.6"},
      {:phoenix_live_reload, "~> 1.0", only: :dev},
      {:gettext, "~> 0.11"},
      {:cowboy, "~> 1.0"},
      {:arc,  "~> 0.5.2"},
      {:arc_ecto, "~> 0.3.2"},
      {:ex_aws, "~> 0.4.10"},
      {:httpoison, "~> 0.9"},
      {:poison, "~> …
Run Code Online (Sandbox Code Playgroud)

elixir phoenix-framework plug

4
推荐指数
2
解决办法
1133
查看次数

凤凰城/插件/牛仔中的 RewriteUrl?

如何在phoenix中重写Url?
例如将所有请求重写//www.app.com/xyz//app.com/xyz

有没有一个简单的选择,比如force_ssl?有谁知道在哪里插入它?有插头选项吗?

elixir cowboy phoenix-framework plug

3
推荐指数
1
解决办法
1342
查看次数

Phoenix框架模式匹配请求标头

我正在尝试为API版本实现自定义插件.现在我需要能够匹配通过请求头传递的值(即Accept: application/vnd.app.v1+json).到目前为止,我已实施以下内容:

defmodule UsersApi.Plugs.APIVersion do
  import Plug.Conn

  @versions ["application/vnd.app.v1+json", "application/vnd.app.v2+json"]

  def init(version), do: version

  def call(%{req_headers: %{"accept" => version}} = conn, _) when version in @versions do
    assign(conn, :version, version)
  end

  def call(conn, version), do: assign(conn, :version, version)
end
Run Code Online (Sandbox Code Playgroud)

这当前没有工作,并且call/2在没有指定接受标头时被设计为后备的第二个.如何匹配请求标头?

elixir phoenix-framework plug

3
推荐指数
1
解决办法
3089
查看次数

有没有办法让凤凰插头只用于一条路线?

在凤凰城,我的路线如下:

  scope "/", ManaWeb do
    pipe_through [:browser, :auth]
    get "/register",  RegistrationController, :new
    post "/register", RegistrationController, :register
  end
Run Code Online (Sandbox Code Playgroud)

但是我想为最后一条路线(POST)设置一个插头。

我将如何使用当前的工具来解决这个问题?

routing elixir phoenix-framework plug

3
推荐指数
2
解决办法
462
查看次数

Plug.Parser 不读取/解析 JSON 正文

我正在编写 Elixir (1.8) + Plug_Cowboy (2.0.2) + Jason (1.1.2) 服务器。从我从文档中获得的信息来看,一旦 Plug 解析器通过,我应该将所有内容都放在body_params. 问题是conn.body_params在我的情况下访问会返回%Plug.Conn.Unfetched{aspect: :body_params}. 检查下面的代码:

defmodule Test.Router do
  use Plug.Router
  require Logger

  plug :match
  plug Plug.Parsers, parsers: [:json],
                     pass: ["application/json", "text/json"],
                     json_decoder: Jason
  plug :dispatch

  post "/test" do
    Logger.debug inspect(conn.body_params)
    conn
      |> put_resp_content_type("text/plain")
      |> send_resp(204, "Got it")
    end
end
Run Code Online (Sandbox Code Playgroud)

知道发生了什么吗?

我用以下方法测试:

curl -H "Content-Type: text/json" -d "{one: 1, two: 2}" 127.0.0.1:8080/test
Run Code Online (Sandbox Code Playgroud)

我曾尝试添加:urlencoded解析器,或重新排列插件顺序,但无济于事。

elixir plug

2
推荐指数
1
解决办法
1142
查看次数

Elixir插件中的版本控制API

我有两个模块:lib / endpoints / v1 / base.ex和lib / endpoints / v2 / base.ex。

lib / endpoints / v1 / base.ex

defmodule Http.Endpoints.V1.Base do
  require Logger
  use Plug.Router

  plug(:match)
  plug(:dispatch)
  plug(Plug.Logger)
  plug(Plug.Parsers, parsers: [:json], json_decoder: Poison)

  get "/v1/ping" do
    send_resp(conn, 200, "pong!")
  end
end
Run Code Online (Sandbox Code Playgroud)

lib / endpoints / v2 / base.ex

defmodule Http.Endpoints.V2.Base do
  require Logger
  use Plug.Router

  plug(:match)
  plug(:dispatch)
  plug(Plug.Logger)
  plug(Plug.Parsers, parsers: [:json], json_decoder: Poison)

  get "/v2/ping" do
    send_resp(conn, 200, "pong! 2")
  end
end
Run Code Online (Sandbox Code Playgroud)

如果我放入应用程序,则端点可以正常工作。

Plug.Cowboy.child_spec(scheme: :http, plug: Http.Endpoints.V1.Base, options: …

elixir plug

2
推荐指数
1
解决办法
87
查看次数

标签 统计

plug ×10

elixir ×9

phoenix-framework ×8

cowboy ×1

endpoint ×1

http ×1

routing ×1

terminal ×1