Revel의 주요 프로세스
대략적인 처리 절차라면
다음은 사내 학습회에 사용할 자료입니다.
revel의 주요 처리 프로세스
http://revel.github.io/manual/concepts.html
PlayFramework를 참조하여 제작되었습니다.
기본적으로 MVC다.
revel 응용 프로그램 제작 방법
응용 프로그램 만들기
$ revel new sample
~
~ revel! http://revel.github.io
~
Your application is ready:
/Users/username/.go/src/sample
You can run it with:
revel run sample
$GOPATH/src/sample
의 파일 구조.
├── app
│ ├── controllers
│ │ └── app.go
│ ├── init.go
│ └── views
│ ├── App
│ │ └── Index.html
│ ├── debug.html
│ ├── errors
│ │ ├── 404.html
│ │ └── 500.html
│ ├── flash.html
│ ├── footer.html
│ └── header.html
├── conf
│ ├── app.conf
│ └── routes
├── messages
│ └── sample.en
├── public
│ ├── css
│ │ └── bootstrap.css
│ ├── img
│ │ ├── favicon.png
│ │ ├── glyphicons-halflings-white.png
│ │ └── glyphicons-halflings.png
│ └── js
│ └── jquery-1.9.1.min.js
└── tests
└── apptest.go
계획을 집행하다
$ revel run sample
를 시작하고 액세스할 때 app/routes/routes.go
및 app/tmp/main.go
에 파일을 생성합니다..
├── app
│ ├── controllers
│ │ └── app.go
│ ├── init.go
│ ├── routes # ここと
│ │ └── routes.go
│ ├── tmp # ここが新しい
│ │ └── main.go
│ └── views
# 省略
내부 구조
https://github.com/hirokidaichi/goviz 출력
각 구성
응용 프로그램 만들기
$ revel new sample
~
~ revel! http://revel.github.io
~
Your application is ready:
/Users/username/.go/src/sample
You can run it with:
revel run sample
$GOPATH/src/sample
의 파일 구조.
├── app
│ ├── controllers
│ │ └── app.go
│ ├── init.go
│ └── views
│ ├── App
│ │ └── Index.html
│ ├── debug.html
│ ├── errors
│ │ ├── 404.html
│ │ └── 500.html
│ ├── flash.html
│ ├── footer.html
│ └── header.html
├── conf
│ ├── app.conf
│ └── routes
├── messages
│ └── sample.en
├── public
│ ├── css
│ │ └── bootstrap.css
│ ├── img
│ │ ├── favicon.png
│ │ ├── glyphicons-halflings-white.png
│ │ └── glyphicons-halflings.png
│ └── js
│ └── jquery-1.9.1.min.js
└── tests
└── apptest.go
계획을 집행하다
$ revel run sample
를 시작하고 액세스할 때 app/routes/routes.go
및 app/tmp/main.go
에 파일을 생성합니다..
├── app
│ ├── controllers
│ │ └── app.go
│ ├── init.go
│ ├── routes # ここと
│ │ └── routes.go
│ ├── tmp # ここが新しい
│ │ └── main.go
│ └── views
# 省略
내부 구조
https://github.com/hirokidaichi/goviz 출력
각 구성
main
: 명령 도구harness
: 응용을 위한 구축이나watch 등revel
: 코어config
: 구성 설정websocket
: websocket pathtree
:router 매칭/:userId
의 매칭simpleuuid
: uid 생성fsnotify
: file의watch에서 사용gocolorize
: 콘솔에 색칠Harness
watch
config/app.conf
의 워치 상태에 따라 Harness 측의 행동에 변화가 발생한다.build
github.com/revel/revel/harness/build.고오 안에 빌딩이 있어요.
https://github.com/revel/revel/blob/master/harness/build.go#L40
main.go와routes.go의 생성
// Generate two source files.
templateArgs := map[string]interface{}{
"Controllers": sourceInfo.ControllerSpecs(),
"ValidationKeys": sourceInfo.ValidationKeys,
"ImportPaths": calcImportAliases(sourceInfo),
"TestSuites": sourceInfo.TestSuites(),
}
genSource("tmp", "main.go", MAIN, templateArgs)
genSource("routes", "routes.go", ROUTES, templateArgs)
main.go.로테스."go"가 있는 템플릿
main.go 제작 후
github.com/revel/revel/harness/app.go
측에서 옵션main을 제공합니다.실행 고github.com/revel/revel/harness/app.go
// AppCmd manages the running of a Revel app server.
// It requires revel.Init to have been called previously.
type AppCmd struct {
*exec.Cmd
}
//
// (省略)
//
// Run the app server inline. Never returns.
func (cmd AppCmd) Run() {
revel.TRACE.Println("Exec app:", cmd.Path, cmd.Args)
if err := cmd.Cmd.Run(); err != nil {
revel.ERROR.Fatalln("Error running:", err)
}
}
main.goo 처리 github.com/revel/revel/server.go
에 func Run()
가 있는데 자꾸 달리는 것 같아.
요청을 받은 후handler를 실행합니다
revel.Controller 및 revelRequest, revel.Response 작성
다양한 Filters를 실행합니다.
Filters
실행 시 적용할 Sccaffold의revel new
에 Filters가 설치되어 있습니다.
https://github.com/revel/revel/blob/master/harness/build.go#L288
https://github.com/revel/revel/blob/master/harness/build.go#L341
app/init.gofunc init() {
// Filters is the default set of global filters.
revel.Filters = []revel.Filter{
revel.PanicFilter, // Recover from panics and display an error page instead.
revel.RouterFilter, // Use the routing table to select the right Action
revel.FilterConfiguringFilter, // A hook for adding or removing per-Action filters.
revel.ParamsFilter, // Parse parameters into Controller.Params.
revel.SessionFilter, // Restore and write the session cookie.
revel.FlashFilter, // Restore and write the flash cookie.
revel.ValidationFilter, // Restore kept validation errors and save new ones from cookie.
revel.I18nFilter, // Resolve the requested language
HeaderFilter, // Add some security based headers
revel.InterceptorFilter, // Run interceptors around the action.
revel.CompressFilter, // Compress the result.
revel.ActionInvoker, // Invoke the action.
}
// register startup functions with OnAppStart
// ( order dependent )
// revel.OnAppStart(InitDB)
// revel.OnAppStart(FillCache)
}
app/init.go
트리거 컨트롤러가 특정 동작을 수행합니다.
최종적으로 revel.ActionInvoker
액션 결과가 나올 거예요. (템플릿이 아니에요)
github.com/revel/revel/server.gofunc handleInternal(w http.ResponseWriter, r *http.Request, ws *websocket.Conn) {
var (
req = NewRequest(r)
resp = NewResponse(w)
c = NewController(req, resp)
)
req.Websocket = ws
Filters[0](c, Filters[1:]) // ここで各フィルターが実行 & 最後にアクション実行
if c.Result != nil {
c.Result.Apply(req, resp)
} else if c.Response.Status != 0 {
c.Response.Out.WriteHeader(c.Response.Status)
}
// Close the Writer if we can
if w, ok := resp.Out.(io.Closer); ok {
w.Close()
}
}
결과적 성형, 생성
func init() {
// Filters is the default set of global filters.
revel.Filters = []revel.Filter{
revel.PanicFilter, // Recover from panics and display an error page instead.
revel.RouterFilter, // Use the routing table to select the right Action
revel.FilterConfiguringFilter, // A hook for adding or removing per-Action filters.
revel.ParamsFilter, // Parse parameters into Controller.Params.
revel.SessionFilter, // Restore and write the session cookie.
revel.FlashFilter, // Restore and write the flash cookie.
revel.ValidationFilter, // Restore kept validation errors and save new ones from cookie.
revel.I18nFilter, // Resolve the requested language
HeaderFilter, // Add some security based headers
revel.InterceptorFilter, // Run interceptors around the action.
revel.CompressFilter, // Compress the result.
revel.ActionInvoker, // Invoke the action.
}
// register startup functions with OnAppStart
// ( order dependent )
// revel.OnAppStart(InitDB)
// revel.OnAppStart(FillCache)
}
func handleInternal(w http.ResponseWriter, r *http.Request, ws *websocket.Conn) {
var (
req = NewRequest(r)
resp = NewResponse(w)
c = NewController(req, resp)
)
req.Websocket = ws
Filters[0](c, Filters[1:]) // ここで各フィルターが実行 & 最後にアクション実行
if c.Result != nil {
c.Result.Apply(req, resp)
} else if c.Response.Status != 0 {
c.Response.Out.WriteHeader(c.Response.Status)
}
// Close the Writer if we can
if w, ok := resp.Out.(io.Closer); ok {
w.Close()
}
}
Result 인터페이스
type Result interface {
Apply(req *Request, resp *Response)
}
Results의 구성체
type ErrorResult struct {
type PlaintextErrorResult struct {
type RenderTemplateResult struct {
type RenderHtmlResult struct {
type RenderJsonResult struct {
type RenderXmlResult struct {
type RenderTextResult struct {
type ContentDisposition string
type BinaryResult struct {
type RedirectToUrlResult struct {
type RedirectToActionResult struct {
RenderTemplateResult의 경우
아무것도 하지 않으면
c.Result
이용된다.template를 사용하여 생성).
그리고 응답에 그걸 넣고 요청 1개를 처리합니다.
나무랄 데 없는 일
Reference
이 문제에 관하여(Revel의 주요 프로세스), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/taizo/items/b600b70f3e8f67e3b9c0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)