标签: phoenix-framework

如何将表格中的大文件上传到凤凰城?

我有一个带有文件字段的HTML表单,用于将文件上传到/file我的Phoenix应用程序中的路由.

我从命令行模仿这种行为,curl -v -F "file=@MyTestFile" http://localhost:4000/file/以便更快地进行测试.

当我使用一个大文件(转折点似乎约为7.7MB)时,我从Plug获得以下异常:

18:40:38.897 [错误]错误在过程<0.420.0>与退出值:{[{原因,#{ ' 例外 '=>真,' 结构 '=>' Elixir.Plug.Parsers.RequestTooLargeError',消息=>零}},{MFA,{ 'Elixir.Plug.Adapters.Cowboy.Handler',INIT,3}},{堆栈跟踪,[{ 'Elixir.Plug.Parsers',减少,如图6所示,[{文件," LIB /插......

是否有解决方法允许上传更大的文件?

:length在Plug中似乎有一个选项关键字,但我怎么能从凤凰城设置它?这个特殊价值8_000_000被选中的原因是什么?

elixir phoenix-framework

10
推荐指数
1
解决办法
3088
查看次数

如何覆盖凤凰城的错误?

我在凤凰上建立了宁静的api(json).而且我不需要html的支持.

如何覆盖凤凰城的错误?示例错误: - 500 - 404没有找到路由和其他.

elixir phoenix-framework

10
推荐指数
2
解决办法
2814
查看次数

在Phoenix中设置父视图/模板中的属性

我想title在凤凰城的子视图/控制器中设置应用程序模板中的标记.

title标签是内部的web/templates/layout/app.html.eex模板,但我有一个ArticlesController这使得在<%= @inner %>Rails中来的时候,会用yield电话,但无法找到其在凤凰城等价的.

将属性从其子项传递到父模板/视图的正确方法是什么?

elixir phoenix-framework

10
推荐指数
1
解决办法
1072
查看次数

如何在没有Phoenix的情况下配置Plug.Static

我现在被困了几个小时,试图弄清楚如何在没有任何其他框架的情况下配置Plug.Static (Phoenix,Sugar,...); 只是牛仔,插头和Elixir.我只是不知道如何把东西放在路由器里.

  plug :match
  plug Plug.Static, at: "/pub", from: :cerber
  plug :dispatch

  get "/" do
    Logger.info "GET /"
    send_resp(conn, 200, "Hello world\n")
  end
Run Code Online (Sandbox Code Playgroud)
  1. 申报是Plug.Static在正确的地方吗?不应该之后plug :dispatch吗?
  2. 我是否需要定义其他路线
  3. 有这个声明:
    1. 要达到的URL是什么index.html
    2. 文件系统index.html应该位于何处

我迷失了......

感谢您的反馈

elixir cowboy phoenix-framework

10
推荐指数
1
解决办法
2811
查看次数

Phoenix控制器中的current_user通过Plug传递

将此代码示例作为Plug来处理身份验证:

defmodule Financeweb.APIAuth do
...

  def call(conn, _opts) do
  ...

    if authenticated_user do
      conn
      |> assign(:current_user, user)
    else
      conn
      |> send_resp(401, "{\"error\":\"unauthorized\"}")
      |> halt
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

所以,我通过current_user下游传递变量Plug.Conn.assign/3.在Phoenix控制器中获取此变量的最佳方法是什么?我这样做(下面的代码),但我确信有更好的方法来做到这一点.

def index(conn, _) do
  user_id = conn.assigns.current_user.id 
end
Run Code Online (Sandbox Code Playgroud)

elixir phoenix-framework

10
推荐指数
1
解决办法
1795
查看次数

在elixir phoenix应用程序中创建后台作业的正确方法

  def create(conn, %{"data" => %{"attributes" => user_params}}) do

    changeset = User.changeset(%User{}, user_params)

    case Repo.insert(changeset) do
      {:ok, user} ->
        UserMailer.send_welcome_email(user)
        conn
        |> put_status(:created)
        |> render("show.json", model: user)
      {:error, changeset} ->
        conn
        |> put_status(:unprocessable_entity)
        |> render(MyApp.ChangesetView, "error.json", changeset: changeset)
    end
  end
Run Code Online (Sandbox Code Playgroud)

在此控制器操作中,UserMailer.send_welcome_email是同步的,请求等待.

我想让它异步,所以产生了这样的过程

spawn_link(fn ->
  UserMailer.send_welcome_email(user)
end)
Run Code Online (Sandbox Code Playgroud)

请求不会等到邮件发送完毕.

  • 虽然它有效但是它是正确的方法吗?
  • 这些过程是否有可能成为孤儿,或者他们只是在立即执行后死亡?
  • 我们应该创建一个Supervisor吗?
  • 我们应该使用像https://github.com/akira/exq这样的库吗?(我觉得即使spawn_link失败了,也记录在我们的凤凰日志中,它会这样做)

elixir phoenix-framework

10
推荐指数
1
解决办法
3778
查看次数

如何更新Ecto中的关系?

我有这样的订阅.

defmodule Rebirth.Subscription do
  use Rebirth.Web, :model

  schema "subscriptions" do
    ...
    belongs_to :user, Rebirth.User
    ...
  end

  ...

  def update_user(model, params \\ :empty) do
    model
    |> cast(params, @required_fields, @optional_fields)
    |> cast_assoc(:user, required: false)    
  end
end
Run Code Online (Sandbox Code Playgroud)

我想将用户与订阅相关联

所以我试过了

Rebirth.Subscription.update_user(subscription, %{user_id: 1})
Run Code Online (Sandbox Code Playgroud)

要么

Rebirth.Subscription.update_user(subscription, %{user: user})
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我收到以下错误:

** (ArgumentError) unknown assoc `user` in `cast_assoc`
Run Code Online (Sandbox Code Playgroud)

如何更新user_id?

谢谢!

elixir ecto phoenix-framework

10
推荐指数
1
解决办法
3418
查看次数

Elixir + Phoenix Channels内存消耗

我对Elixir和Phoenix Framework很新,所以可能我的问题有点愚蠢.

我有一个应用程序,Elixir + Phoenix Framework作为后端,Angular 2作为前端.我使用Phoenix Channels作为前端/后端交换的渠道.我发现了一个奇怪的情况:如果我从后端向前端发送大量数据,那么特定的通道进程内存消耗就会达到数百MB.即使在传输结束后,每个连接(每个通道进程)也会占用大量内存.

以下是来自后端频道说明的代码段:

defmodule MyApp.PlaylistsUserChannel do
  use MyApp.Web, :channel

  import Ecto.Query

  alias MyApp.Repo
  alias MyApp.Playlist

  # skipped ... #

  # Content list request handler
  def handle_in("playlists:list", _payload, socket) do 
    opid = socket.assigns.opid + 1
    socket = assign(socket, :opid, opid)

    send(self, :list)
    {:reply, :ok, socket}
  end

  # skipped ... #        

  def handle_info(:list, socket) do

    payload = %{opid: socket.assigns.opid}

    result =
    try do
      user = socket.assigns.current_user
      playlists = user
                  |> Playlist.get_by_user
                  |> order_by([desc: :updated_at])
                  |> Repo.all …
Run Code Online (Sandbox Code Playgroud)

elixir phoenix-framework phoenix-channels

10
推荐指数
1
解决办法
2293
查看次数

最适合从Phoenix应用程序体系结构中的第三方API服务获取数据的位置

我有一个问题,关于如何最好地处理从我的凤凰应用程序的体系结构中的第三方API获取数据.基本上,我有一个控制器接收客户端的IP地址作为参数.然后,我需要从外部API获取与该IP地址关联的地理位置,并将它们存储在数据库中(即ipgeolocation).

现在我的方法是使用一个插件,然后在连接结构中返回结果.

但我也可以通过直接在模型中创建函数来获取数据,然后在变更集操作期间调用它.

或许还有另一种选择,例如将其作为OTP应用程序.

在这里寻找关于最佳方法的一些指导,或者至少在一方与另一方之间进行权衡.

虽然我的场景是具体的,但这可能是人们遇到的常见设计问题.

architecture api phoenix-framework

10
推荐指数
1
解决办法
394
查看次数

Phoenix Framework的Plug.Conn中assign和put_session有什么区别?

文档(https://hexdocs.pm/plug/Plug.Conn.html)命名两个函数,允许在一个键值对中存储conn

assign(conn, key, value)
Run Code Online (Sandbox Code Playgroud)

为连接中的键分配值

put_session(conn, key, value)
Run Code Online (Sandbox Code Playgroud)

将指定值放在给定键的会话中

这两个功能有什么区别?

session elixir phoenix-framework

10
推荐指数
1
解决办法
1454
查看次数