Revel의 주요 프로세스

15894 단어 GoRevel
Go 프레임워크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.goapp/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

  • 사용자 프로그램을 지우고 컨트롤러를 시작하는main이 됩니다.go 생성, 사용자 응용 서버 시작
  • 사용자 프로그램의build와run입니다.컴파일 오류가 표시됩니다.
  • rebuild과 모니터링도 이곳을 통해
  • watch

  • 앱 측config/app.conf의 워치 상태에 따라 Harness 측의 행동에 변화가 발생한다.
  • Harness용port
  • 열기

    build


    github.com/revel/revel/harness/build.고오 안에 빌딩이 있어요.
  • app/tmp/opp/routes/의 정리
  • 애플리케이션에 필요한 정보 수집(불필요한 정보 제외)
    https://github.com/revel/revel/blob/master/harness/build.go#L40
  • db.import을 설정한 상태에서 실행

  • 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.gofunc 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.go
    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)
    }
    
    app/init.go 트리거 컨트롤러가 특정 동작을 수행합니다.
    최종적으로 revel.ActionInvoker 액션 결과가 나올 거예요. (템플릿이 아니에요)
    github.com/revel/revel/server.go
    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의 유형에 따라 최종적으로 되돌아오는 string
  • 을 변경합니다

    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개를 처리합니다.

    나무랄 데 없는 일

  • 로터의 행동
  • watch시의 행위
  • Filter당 동작
  • Action Invoker 실행 Binder
  • Interceptors
  • Validation
  • 좋은 웹페이지 즐겨찾기