1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/andeyalee-faygo

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README_ZH.md 21 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 27.11.2024 19:11 698075e

Faygo — это быстрый и лаконичный веб-фреймворк Go, который позволяет создавать высокопроизводительные веб-приложения с использованием минимального количества кода, особенно в случае API-интерфейсов.

Достаточно определить struct Handler, чтобы Faygo автоматически привязывал и проверял параметры запроса, а также генерировал онлайн-документацию по API.

Версия: v1.2.0

Требования к установке: версия Go должна быть не ниже 1.8.

Быстрое использование:

  • Способ 1: скачивание исходного кода.
go get -u -v github.com/andeya/faygo
  • Способ 2: развёртывание инструмента (Go to fay).
go get -u -v github.com/andeya/fay
        fay command [arguments]

The commands are:
        new        创建、编译和运行(监控文件变化)一个新的faygo项目
        run        编译和运行(监控文件变ция)任意一个已存在的golang项目

fay new appname [apptpl]
        appname    指定新faygo项目的创建目录
        apptpl     指定一个faygo项目模板(可选)

fay run [appname]
        appname    指定待运行的golang项目路径(可选)

Особенности фреймворка:

  • Один struct Handler решает множество задач: определение Handler/Middleware, привязка и проверка параметров запроса, генерация Swagger2.0 API онлайн-документации, ORM-отображение базы данных.
  • Handler и Middleware полностью идентичны и оба реализуют интерфейс Handler (func или struct), образуя цепочку операций маршрутизации. Разница между ними заключается только в концепции.
  • Поддерживаются различные типы сетей: HTTP, HTTPS/HTTP2 (TLS), HTTPS/HTTP2 (Let's Encrypt TLS), HTTPS/HTTP2 (Let’s Encrypt TLS на UNIX socket), HTTP (UNIX socket), HTTPS/HTTP2 (TLS на UNIX socket).
  • Поддержка односерверного однослушателя, односерверного многослушателя, многосерверного многослушателя и других конфигураций, где информация о каждом сервере независима.
  • Разработка высокопроизводительных маршрутов на основе httprouter, поддержка цепочечной и древовидной регистрации стилей, а также гибких статических файловых маршрутов (например, DirFS, RenderFS, MarkdownFS и т. д.).
  • Плавное закрытие и плавное обновление, предоставляемые инструментом fay для создания новых проектов, горячей компиляции и метапрограммирования.
  • Использование мощного pongo2 в качестве HTML-движка рендеринга.
  • Наличие функции кэширования файлов, которая обеспечивает плавный доступ к файлам и может использоваться для кэширования статических файлов.
  • Кроссплатформенная система цветного журнала, поддерживающая вывод на консоль и файл одновременно.
  • Предоставление функций управления сеансами (например, использование постоянного хранилища, необходимо зарегистрировать соответствующий пользовательский тип с помощью gob.Register() перед запуском службы).
  • Поддержка Gzip для глобальной конфигурации.
  • Предотвращение атак XSRF (подделка межсайтовых запросов).
  • Большинство функций используют простые файлы конфигурации ini для избежания ненужной перекомпиляции, и эти файлы поддерживают автоматическое заполнение значений по умолчанию.
  • Поддержка gorm, xorm, sqlx, directSQL, Websocket, ini, http client и многих других часто используемых расширений.

Простой пример:

package main

import (
    // "mime/multipart"
    "time"
    "github.com/andeya/faygo"
)

type Index struct {
    Id        int      `param:"<in:path> <required> <desc:ID> <range: 0:10>"`
    Title     string   `param:"<in:query> <nonzero>"`
    Paragraph []string `param:"<in:query> <name:p> <len: 1:10> <regexp: ^[\\w]*$>"`
    Cookie    string   `param:"<in:cookie> <name:faygoID>"`
    // Picture         *multipart.FileHeader `param:"<in:formData> <name:pic> <maxmb:30>"`
}

func (i *Index) Serve(ctx *faygo.Context) error {
    if ctx.CookieParam("faygoID") == "" {
        ctx.SetCookie("faygoID", time.Now().String())
    }
    return ctx.JSON(200, i)
}

func main() {
    app := faygo.New("myapp", "0.1")

    // Register the route in a chain style
    app.GET("/index/:id", new(Index))

    // Register the route in a tree style
    // app.Route(
    //     app.NewGET("/index/:id", new(Index)),
    // )

    // Start
``` **Сервис**

```faygo.Run()```

**HTTP GET:**

    * *URL:* 
        *http://localhost:8080/index/1?title=test&p=abc&p=xyz*

*Ответ:*

    {
        "Id": 1,
        "Title": "test",
        "Paragraph": [
            "abc",
            "xyz"
        ],
        "Cookie": "2016-11-13 01:14:40.9038005 +0800 CST"
    }

## Операции и промежуточное ПО

Операции и промежуточное ПО одинаковы, все они реализуют интерфейс Handler!

- Тип функции

```go
// Не содержит API-документации
func Page() faygo.HandlerFunc {
    return func(ctx *faygo.Context) error {
        return ctx.String(200, "faygo")
    }
}

// Содержит API-документацию
var Page2 = faygo.WrapDoc(Page(), "Описание страницы 2", "Текст")
  • Структурный тип
// Param операция связывает и проверяет параметры запроса с помощью тега
type Param struct {
    Id    int    `param:"<in:path> <required> <desc:ID> <range: 0:10>"`
    Title string `param:"<in:query>"`
}

// Serve реализует интерфейс Handler
func (p *Param) Serve(ctx *faygo.Context) error {
    return ctx.JSON(200,
        faygo.Map{
            "Struct Params":    p,
            "Additional Param": ctx.PathParam("additional"),
        }, true)
}

// Doc реализует интерфейс API-документа (необязательно)
func (p *Param) Doc() faygo.Doc {
    return faygo.Doc{
        // Объявление интерфейса в API-документе
        Note: "param desc",
        // Объявить формат ответа в API-документе (JSON)
        Return: faygo.JSONMsg{
            Code: 1,
            Info: "success",
        },
        // Добавить дополнительные параметры запроса в API-документ (необязательно)
        Params: []faygo.ParamInfo{
            {
                Name:  "additional",
                In:    "path",
                Model: "a",
                Desc:  "Определено методом `Doc()`",
            },
        },
    }
}

Функции фильтрации

Функция фильтрации должна быть типа HandlerFunc!

func Root2Index(ctx *faygo.Context) error {
    // Запретить прямой доступ к `/index`
    if ctx.Path() == "/index" {
        ctx.Stop()
        return nil
    }
    if ctx.Path() == "/" {
        ctx.ModifyPath("/index")
    }
    return nil
}

Регистрация маршрутов

  • Иерархическое дерево
// Создать новое приложение, параметры: имя, версия
var app1 = faygo.New("myapp1", "1.0")

// Маршрут
app1.Filter(Root2Index).
    Route(
        app1.NewNamedGET("Страница тестирования 1", "/page", Page()),
        app1.NewNamedGET("Страница тестирования 2", "/page2", Page2),
        app1.NewGroup("home",
            app1.NewNamedGET("Тестовый параметр", "/param", &Param{
                // Установить значения по умолчанию для связанных параметров в API-документах (необязательно)
                Id:    1,
                Title: "Тестовый параметр",
            }),
        ),
    )
  • Линейная цепочка
// Создать новое приложение, параметры: имя, версия
var app2 = faygo.New("myapp2", "1.0")

// Маршрут
app2.Filter(Root2Index)
app2.NamedGET("тестовая страница", "/page", Page())
app2.NamedGET("тестовая страница 2", "/page2", Page2)
app2.Group("home") {
    app2.NamedGET("параметр тестирования", "/param", &Param{
        // Установить значения по умолчанию для связанных параметров в API-документах (необязательно)
        Id:    1,
        Title: "параметр тестирования",
    })
}

Плавное завершение работы и перезапуск

  • Плавное завершение
kill [pid]
  • Мягкий перезапуск
kill -USR2 [pid]

Описание файла конфигурации

  • Каждое приложение имеет отдельный файл конфигурации, имя файла формата config/{appname}[_{version}].ini, подробности конфигурации:
net_types              = http|https              # Список различных типов сетей, поддерживаемых http | https | unix_http | unix_https | letsencrypt | unix_letsencrypt
addrs                  = 0.0.0.0:80|0.0.0.0:443  # Несколько адресов прослушивания
tls_certfile           =                         # Путь к файлу сертификата TLS
tls_keyfile            =                         # Путь к файлу ключа TLS
letsencrypt_dir        =                         # Каталог кэша сертификатов Let's Encrypt TLS
unix_filemode          = 0666                    # Права доступа к файлам UNIX listener, требуется использовать восьмеричное число
http_redirect_https    = false                   # Перенаправление с 'http://hostname:port1' на 'https://hostname:port2'
read_timeout           = 0s                      # Тайм-аут чтения данных запроса; ns|µs|ms|s|m|h
write_timeout          = 0s                      # Время ожидания записи данных ответа; ns|µs|ms|s|m|h
multipart_maxmemory_mb = 32                      # Максимальный объём памяти, разрешённый при загрузке файлов
slow_response_threshold= 0s                      # Когда время отклика > slow_response_threshold, уровень журнала устанавливается на «WARNING»; 0 означает без ограничений; ns|µs|ms|s|m|h
print_body             = false                   # Вывести тело запроса формы в формате JSON, вывести тело других типов запросов в исходном виде

[router]                                         # Область конфигурации маршрутизатора
redirect_trailing_slash   = true                 # Если текущий запрос URL содержит суффикс `/`, а соответствующий маршрут не существует, например, `/foo/` и существует `/foo`, то автоматически перенаправляется на `/foo`
redirect_fixed_path       = true                 # Автоматическое исправление URL, например, `/FOO` `/..//Foo` все перенаправляются на `/foo` (зависит от redirect_trailing_slash=true) ```
handle_method_not_allowed = true                 # Если включено, то при отсутствии текущего запроса возвращается 405, иначе возвращается 404
handle_options            = true                 # Если включено, автоматически отвечает на запросы класса OPTIONS, в Faygo можно установить обработчик по умолчанию
no_default_params         = false                # Если включено, не использует значения параметров обработчика как значения по умолчанию для запроса
default_upload            = true                 # Автоматически регистрирует статический маршрут по умолчанию: /upload/*filepath
default_static            = true                 # Автоматически регистрирует статический маршрут по умолчанию: /static/*filepath

[xsrf]                                           # Область конфигурации фильтрации подмены межсайтовых запросов (XSRF)
enable        = false                            # Включено ли
key           = faygoxsrf                        # Ключ шифрования
expire_second = 3600                             # Срок действия токена защиты от подделки XSRF

[session]                                        # Область конфигурации сеанса (подробности см. в модуле сеанса beego)
enable                 = false                   # Включено ли
provider               = memory                  # Способ хранения данных
name                   = faygosessionID        # Имя cookie, которое клиент хранит в браузере
provider_config        =                         # Конфигурационная информация, которая зависит от разных движков и имеет разные настройки
cookie_life_second     = 0                       # Время жизни cookie клиента, значение по умолчанию равно 0, что означает срок жизни, равный сроку жизни браузера
gc_life_second         = 300                     # Время запуска сборщика мусора
max_life_second        = 3600                    # Максимальный срок жизни сессии
auto_setcookie         = true                    # Автоматически ли устанавливать значение cookie, связанное с сеансом, обычно по умолчанию используется значение true
domain                 =                         # Домен, к которому можно получить доступ к этому cookie
enable_sid_in_header   = false                   # Следует ли включать идентификатор сеанса в заголовок
name_in_header         = Faygosessionid        # Идентификатор сеанса записывается в заголовок, когда он включён
enable_sid_in_urlquery = false                   # Следует ли включать идентификатор сессии в строку запроса URL

[apidoc]                                         # API-документ
enable      = true                               # Включено ли
path        = /apidoc                            # Путь доступа
nolimit     = false                              # Не ограничивать доступ IP
real_ip     = false                              # Использовать реальный IP клиента для фильтрации
whitelist   = 192.*|202.122.246.170              # Означает разрешение доступа с префиксом 192 или равным 202.122.246.170 IP
desc        =                                    # Описание проекта
email       =                                    # Электронная почта контактного лица
terms_url   =                                    # URL условий обслуживания
license     =                                    # Тип лицензии
license_url =                                    # Содержание лицензии
  • Приложение имеет только одну глобальную конфигурацию, файл называется config/__global__.ini, конфигурация выглядит следующим образом:
[cache]                                          # Область конфигурации файлового кэша
enable         = false                           # Включено ли
size_mb        = 32                              # Разрешённый максимальный объём памяти для кэширования (в МБ), если значение равно 0, система автоматически устанавливает значение 512 КБ
expire_second  = 60                              # Максимальное время кэширования

[gzip]                                           # Область конфигурации сжатия gzip
enable         = false                           # Включено ли
min_length     = 20                              # Минимальная длина содержимого, подлежащего сжатию
compress_level = 1                               # Уровень сжатия нефайловых ответов Body (0–9), обратите внимание, что сжатие файлов всегда выполняется с оптимальным коэффициентом сжатия (9)
methods        = GET                             # Методы запроса, которые разрешено сжимать, если пусто, по умолчанию используются методы GET

[log]                                            # Область конфигурации журнала
console_enable = true                            # Включить ли консоль журнала
console_level  = debug                           # Уровень журнала консоли: критический | ошибка | предупреждение | уведомление | информация | отладка
file_enable    = true                            # Включить ли файл журнала
file_level     = debug                           # Уровень файла журнала: критический | ошибка | предупреждение | уведомление | информация | отладка
async_len      = 0                               # Значение 0 означает синхронную печать, а значение больше 0 означает асинхронное кэширование длины

Структура Handler и описание меток полей

tag key required value desc
param in Есть и только один path (позиция параметра) заполняется автоматически, например, URL http://www.abc.com/a/{path}
param in Есть и только один query (позиция параметра), например, URL http://www.abc.com/a?b={query}
param in Есть и только один formData (позиция параметра), запрос формы, например a=123&b={formData}
param in Есть и только один body (позиция параметра), тело запроса
param in Есть и только один header (позиция параметра), заголовок запроса
param in Есть и только один cookie (позиция параметра), cookie запроса, поддерживает: *http.Cookie, http.Cookie, string, []byte и т. д.
param name Нет (например, id) Имя пользовательского параметра
param required

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/andeyalee-faygo.git
git@api.gitlife.ru:oschina-mirror/andeyalee-faygo.git
oschina-mirror
andeyalee-faygo
andeyalee-faygo
master