后
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结构吗?
我正在研究一个香草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) 我需要检查发送到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) 在一个新的 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。
在更新到我的系统 - MAC之后,我的凤凰应用程序编译得很好但是在我遇到任何路由时都会抛出此错误.
服务器:localhost:4000(http)请求:GET/**(退出)引发异常:**(UndefinedFunctionError)函数:crypto.rand_bytes/1未定义或私有.你是说其中一个:
Run Code Online (Sandbox Code Playgroud)* 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
我的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) 如何在phoenix中重写Url?
例如将所有请求重写//www.app.com/xyz为//app.com/xyz
有没有一个简单的选择,比如force_ssl?有谁知道在哪里插入它?有插头选项吗?
我正在尝试为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在没有指定接受标头时被设计为后备的第二个.如何匹配请求标头?
在凤凰城,我的路线如下:
scope "/", ManaWeb do
pipe_through [:browser, :auth]
get "/register", RegistrationController, :new
post "/register", RegistrationController, :register
end
Run Code Online (Sandbox Code Playgroud)
但是我想为最后一条路线(POST)设置一个插头。
我将如何使用当前的工具来解决这个问题?
我正在编写 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解析器,或重新排列插件顺序,但无济于事。
我有两个模块: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: …