[elixir! #0011] 打开一个phoenix网站时发生了什么?

news/2024/6/29 2:03:02

以 https://www.phoenix-china.org/ 为例.

当我们在浏览器中输入 https://www.phoenix-china.org/ , 按下回车后, 我们将访问phoenix-china论坛. 这是一个使用phoenix框架搭建的网站. 我们省略掉域名的解析等过程, 跟随我们的connection,直接进入phoenix, 看看究竟发生了什么.

接下来我们将称呼connection为Mr.conn.

按图索骥, 在router.ex文件里问路

首先, phoenix把 Mr.conn 带到了web/router.ex文件, 这里是phoenix世界里的中转站. 我们访问的是根域名, 所以对应的路径是"/":

scope "/", PhoenixChina do
    pipe_through [:browser, :browser_session, :admin_browser_session]

    get "/", PageController, :index

以上代码表示当浏览器访问路径"/"时, 将会调用PageController中的:index函数.

Mr.conn 往 controller 文件走去, 却被叫住了, 原来还要先经过pipi_through [...]中的一系列手续, 例如:

  pipeline :browser do
    plug :accepts, ["html"]
    plug :fetch_session
    plug :fetch_flash
    plug :protect_from_forgery
    plug :put_secure_browser_headers
  end

进入控制器

"哎!你是来找我的吗?" ,一走进 page 控制器, Mr.conn 就看到有人拿着一大包东西朝他走来. "我就是 :index 啊, 等你好久了. 喏, 这些东西麻烦你帮我送到 templates/page 那里.我的兄弟 index.html 会好好招待你的."


  def index(conn, %{"label" => label} = params) do
    query = Post
    |> order_by(desc: :is_top, desc: :latest_comment_inserted_at)
    |> preload([:label, :user, :latest_comment, latest_comment: :user])

    query = case PostLabel |> Repo.get_by(content: label) do
      nil -> query
      label_res -> query |> where(label_id: ^label_res.id)
    end

    pagination = query
    |> Repo.paginate(params)

    labels = PostLabel
    |> where(is_hide: false)
    |> order_by(:order)
    |> Repo.all

    user_count = Repo.one(from u in User, select: count(u.id))
    post_count = Repo.one(from p in Post, select: count(p.id))
    comment_count = Repo.one(from c in Comment, select: count(c.id))

    conn
    |> assign(:current_label, label)
    |> assign(:labels, labels)
    |> assign(:pagination, pagination)
    |> assign(:user_count, user_count)
    |> assign(:post_count, post_count)
    |> assign(:comment_count, comment_count)
    |> render("index.html")
  end

Mr.conn 只好拿过包裹, 低头一看, 里面东西还真不少: 标题, 页码... 可是都杂乱地堆在一起. 告别了:index, Mr.conn 背着包裹向 templates/page 文件前进.

渲染页面

到了 templates/page, Mr.conn 却见到了两个人. "你好, 我是 index.html, 全名是 index.html.eex , 旁边这位是来自 views 的page_view.ex. 他负责page 旗下所有页面的渲染工作." Mr.conn 和他们俩握了握手.

"东西都带来了吗?" 'page_view.ex' 问到.

"带来了, 冒昧地问一句, 这些东西有什么用?"

"它们是 MVC 中的 M, 也就是 Model. 平常存储在数据库里, 渲染页面时需要的话就拿出来用. 什么? 你连 MVC 是什么都不知道? 亏你还走了这么远的路. MVC 是一种用来实现用户接口的设计模式, V 就是view(视图), 也就是我们现在要做的. C 指的是 controller(控制器), 你之前去过的."

"哦哦..明白了." Mr.conn 有点脸红, 突然又想起了什么 "那我呢, 我是 MVC 里的什么?"

"你呀, 就是个跑腿的. 待会儿用户点击链接, 你又要到 router 那儿领任务啦."

"..." Mr.conn陷入了深深的沉思.


http://www.niftyadmin.cn/n/3051409.html

相关文章

6.3 神经网络算法(Nerual Networks)应用(下)

1. 简单非线性关系数据集测试(XOR): X: Y 0 0 0 0 1 1 1 0 1 1 1 0 Code: from NeuralNetwork import NeuralNetwork import numpy as np nn NeuralNetwork([2,2,1], tanh) …

vue项目下使用iview总结

iview在IE浏览器下有问题,打开页面是空白 转载于:https://www.cnblogs.com/zhaobao1830/p/7719741.html

Android学习笔记——自定义EditText增加清除功能

运算效果: 实现代码: 1 import android.content.Context;2 import android.graphics.Rect;3 import android.graphics.drawable.Drawable;4 import android.text.Editable;5 import android.text.TextWatcher;6 import android.util.AttributeSet;7 impo…

zookeeper安装(单机和集群)

zookeeper安装单机安装下载解压修改配置文件启动查看状态命令行访问查看帮助查看目录 ls path查看目录下面的数据 get path集群安装创建 myid 文件将zookeeper部署到另外2台机器上修改myid 文件配置其他服务器按照上面一样的操作每个节点都启动zookeeper查看zookeeper状态连接主…

基于Java的电影购票系统的设计与实现(源码+文档+数据库)

本系统是一个网上电影售票系统,可以为用户提供方便的在线订票环境。主要实现了用户注册、登录、查询、订购电影票、管理已订购电影票等功能。通过后台管理模块可以实现对用户、播放厅、电影、影片安排、电影票等的管理等功能。本系统以IntelliJ IDEA 作为开发环境&a…

7.1 简单线性回归 (Simple Linear Regression)下

1. 简单线性回归模型举例: 汽车卖家做电视广告数量与卖出的汽车数量: 1.1 如何练处适合简单线性回归模型的最佳回归线? 使sum of squares最小 1.1.2 计算 分子 (1-2)(14-20)(3-2)(24-20)(2-2)(18-20)(1-2)(17-20)(3-2)(27-20) 6 4 0 3…

Java反射机制的简单学习

今天看了一下Java的反射机制,就此记录一下。 首先,我们要先了解一下什么是反射? 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。  JAVA反射机制是在运行状态中&#xff…

进程系统调用函数

fork pid_t fork(void); 返回值: 0: 子进程 子进程 PID(大于0 的整数): 父进程 getpid() getppid() 转载于:https://www.cnblogs.com/fengyang66/p/6021100.html