프롤로그: Nim으로 작성된 강력한 웹 프레임워크

22854 단어 webframeworknim

Prologue v0.4.0가 출시되었음을 알려드리게 되어 자랑스럽습니다!

Prologue은 Nim 언어로 작성된 강력하고 확장 가능한 웹 프레임워크입니다.

설치



님 버전 >= 1.4.0 Installation
Prologue 버전 >= 0.4.0

nimble install [email protected]


이번 릴리스의 새로운 기능을 살펴보겠습니다!

강력한 라우팅 시스템


Prologue가 네스트 라우팅 시스템으로 전환했습니다.

와일드카드 지원


Prologue는 이제 하나의 URL 섹션과 일치할 수 있는 와일드카드( * ) 문자를 지원합니다.

import prologue


proc hello*(ctx: Context) {.async.} =
  resp "Hello, Prologue"

var app = newApp()
app.get("/static/*", hello)
app.get("/*/static", hello)
app.get("/static/templates/{path}/*", hello)
app.run()


탐욕스러운 지원


Prologue는 이제 URL 끝에 있어야 하는 greedy( $ ) 문자를 지원합니다. 탐욕스러운 캐릭터는 이전 섹션이 일치하는 경우 나머지 URL 섹션을 모두 일치시킵니다.

import prologue


proc hello*(ctx: Context) {.async.} =
  resp "Hello, Prologue"

var app = newApp()
app.get("/test/{param}$", hello)
app.get("/test/static/*$", hello)
app.run()


그룹화 지원


Prologue는 이제 그룹화 라우팅을 지원합니다.

import prologue
import std/with


var 
  app = newApp()
  base = newGroup(app, "/apiv2", @[])
  level1 = newGroup(app,"/level1", @[], base)
  level2 = newGroup(app, "/level2", @[], level1)
  level3 = newGroup(app, "/level3", @[], level2)


proc hello(ctx: Context) {.async.} =
  resp "Hello"

proc hi(ctx: Context) {.async.} =
  resp "Hi"

proc home(ctx: Context) {.async.} =
  resp "Home"


with base:
  get("/hello", hello)
  get("/hi", hi)
  post("/home", home)

# /apiv2/level1/hello
with level1:
  get("/hello", hello)
  get("/hi", hi)
  post("/home", home)

# /apiv2/level1/level2/hello
with level2:
  get("/hello", hello)
  get("/hi", hi)
  post("/home", home)

# /apiv2/level1/level2/level3/hello
with level3:
  get("/hello", hello)
  get("/hi", hi)
  post("/home", home)

app.run()

Prologue는 URL 패턴 그룹화도 지원합니다.

import prologue


var
  app = newApp()
  base = newGroup(app, "/apiv2", @[])
  level1 = newGroup(app,"/level1", @[], base)
  level2 = newGroup(app, "/level2", @[], level1)


proc hello(ctx: Context) {.async.} =
  resp "Hello"

proc hi(ctx: Context) {.async.} =
  resp "Hi"

proc home(ctx: Context) {.async.} =
  resp "Home"


let
  urlpattern1 = @[pattern("/hello", hello), pattern("/hi", hi)]
  urlpattern2 = @[pattern("/home", home)]
  tab = {level1: urlpattern1, level2: urlpattern2}

app.addGroup(tab)
app.run()


확장 가능한 구성 요소



웹소켓 지원



에코 서버 예:

import prologue
import prologue/websocket


proc hello*(ctx: Context) {.async.} =
  var ws = await newWebSocket(ctx)
  await ws.send("Welcome to simple echo server")
  while ws.readyState == Open:
    let packet = await ws.receiveStrPacket()
    await ws.send(packet)

  resp "<h1>Hello, Prologue!</h1>"

var app = newApp()
app.get("/ws", hello)
app.run()


정적 파일 미들웨어



정적 파일 서비스는 이제 미들웨어입니다.

import prologue
import prologue/middlewares/staticfile

var app = newApp()
app.use(staticFileMiddleware("templates"))
app.run()


사용자 정의 컨텍스트



컨텍스트 확장



사용자는 자신의 컨텍스트 개체를 정의할 수 있습니다.

import prologue
import strformat


type
  UserContext = ref object of Context
    data: int


proc hello*(ctx: Context) {.async.} =
  inc ctx.UserContext.data
  echo fmt"{ctx.UserContext.data = }"
  resp "<h1>Hello, Prologue!</h1>"

var app = newApp()
app.use(extendContextMiddleWare(UserContext))
app.get("/", hello)
app.run()


미들웨어



사용자는 자신의 컨텍스트 개체에 대한 미들웨어를 정의할 수 있습니다.

import prologue
import strformat


type
  UserContext = ref object of Context
    data: int

  ExperimentContext = concept ctx
    ctx is Context
    ctx.data is int


proc experimentMiddleware[T: ExperimentContext](ctxType: typedesc[T]): HandlerAsync =
  mixin await
  result = proc(ctx: Context) {.async.} =
    inc ctx.ctxType.data
    echo fmt"{ctx.ctxType.data = }"
    await switch(ctx)

proc hello*(ctx: Context) {.async.} =
  inc ctx.UserContext.data
  echo fmt"{ctx.UserContext.data = }"
  resp "<h1>Hello, Prologue!</h1>"

var app = newApp()
app.use(extendContextMiddleWare(UserContext))
app.use(experimentMiddleware(UserContext))
app.get("/", hello)
app.run()


자원



추가 예시 저장소



@keshon 덕분에

https://github.com/planety/prologue-examples

선적 서류 비치




선적 서류 비치
Index Page


핵심 API
Index Page
Search Page


전체 API
Index Page
Search Page


지원하다



어썸님: https://github.com/xflywind/awesome-nim

멋진 프롤로그: https://github.com/planety/awesome-prologue

디스코드 서버


Prologue에 관심이 있거나 Prologue에 대해 자세히 알아보려면 discord server에 가입하세요.

좋은 웹페이지 즐겨찾기