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

OSCHINA-MIRROR/andeyalee-faygo

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

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

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

Последняя версия

  • Версия: v1.2.0
  • Требования: Go Version ≥ 1.8

Быстрый старт

Есть два способа начать работу:

  1. Скачать исходный код:
go get -u -v github.com/andeya/faygo
  1. Использовать инструменты развёртывания (перейдите на fay):
go get -u -v github.com/andeya/fay
        fay command [arguments]

Команды:
        new        создать, скомпилировать и запустить (мониторить изменения) новый проект Faygo
        run        скомпилировать и запустить (мониторить изменения) любой существующий проект Go

fay new appname [apptpl]
        appname    указывает путь к новому проекту Faygo
        apptpl     опционально указывает тип шаблона проекта Faygo

fay run [appname]
        appname    опционально указывает путь к проекту

Особенности

— Один struct Handler может делать больше:

  • определять Handler/Middleware;
  • связывать и проверять параметры запроса;
  • генерировать онлайн-документ для Swagger 2.0 API;
  • отображать ORM базы данных.

Handler и Middleware абсолютно одинаковы, оба реализуют интерфейс Handler (func или struct), которые вместе составляют цепочку обработчиков маршрутизатора.

Поддерживает несколько типов сетей:

Типы сетей Конфигурация net_types
HTTP http
HTTPS/HTTP2(TLS) https
HTTPS/HTTP2(Let's Encrypt TLS) letsencrypt
HTTPS/HTTP2(Let's Encrypt TLS на UNIX socket) unix_letsencrypt
HTTP(UNIX socket) unix_http
HTTPS/HTTP2(TLS на UNIX socket) unix_https

— Поддержка односервисного и однослушающего, односервисного и многослушающего, многосервисного и многослушающего и так далее. Конфигурация нескольких сервисов независима друг от друга.

— Высокопроизводительный маршрутизатор на основе httprouter поддерживает стили регистрации как в цепочке, так и в дереве; поддерживает гибкий маршрутизатор статических файлов (например, DirFS, RenderFS, MarkdownFS и т. д.).

— Поддерживает плавное завершение работы и перезапуск, предоставляет инструменты fay, которые имеют новые проекты, горячую компиляцию, метапрограммирование.

— Использует самый мощный pongo2 в качестве механизма рендеринга HTML.

— Поддерживает кэширование памяти почти LRU (в основном используется для кеша статических файлов).

— Поддерживает кроссплатформенную систему цветных журналов и имеет два выходных интерфейса (консоль и файл).

— Поддерживает управление сеансами (если вы используете постоянный механизм хранения, вы должны использовать 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))

    // Start the service
    faygo.Run()
}
/*
http GET:
    http://localhost:8080/index/1?title=test&p=abc&p=xyz
response:
    {
        "Id": 1,
        "Title": "test",
        "Paragraph": [
            "abc",
            "xyz"
        ],
        "Cookie": "2016-11-13 01:14:40.9038005 +0800 CST"
    }
*/

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

  • Функция типа:
// Page handler doesn't contains API doc description
func Page() faygo.HandlerFunc {
    return func(ctx *faygo.Context) error {
        return ctx.String(200, "faygo")
    }
}

// Page2 handler contains API doc description
var Page2 = faygo.WrapDoc(Page(), "test page2 notes", "test")
  • Структурный тип:
// Param binds and validates the request parameters by Tags
type Param struct {
    Id    int    `param:"<in:path> <required> <desc:ID> <range: 0:10>"`
    Title string `param:"<in:query>"`
}

// Serve implemente Handler interface
func (p *Param) Serve(ctx *faygo.Context) error {
    return ctx.JSON(200,
        faygo.Map{
            "Struct Params":    p,
            "Additional Param": ctx.PathParam("additional"),
        }, true)
}

// Doc implemente API Doc interface (optional)
func (p *Param) Doc() faygo.Doc {
    return faygo.Doc{
        // Add the API notes to the API doc
        Note: "param desc",
        // declare the response content format to the API doc
        Return: faygo.JSONMsg{
            Code: 1,
            Info: "success",
        },
        // additional request parameter declarations to the API doc (optional)
        Params: []faygo.ParamInfo{
            {
                Name:  "additional",
                In:    "path",
                Model: "a",
                Desc:  "defined by the `Doc()` method",
            },
        },
    }
}

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

func Root2Index(ctx *faygo.Context) error {
    // Direct access to `/index` is not allowed
    if ctx.Path() == "/index" {
        ctx.Stop()
        return nil
    }
    if ctx.Path() == "/" {
        ctx.ModifyPath("/index")
    }
    return nil
}

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

  • Стиль дерева:
// New application object, params: name, version
var app1 = faygo.New("myapp1", "1.0")

// router
app1.Filter(Root2Index).
    Route(
        app1.NewNamedGET("test page", "/page", Page()),
        app1.NewNamedGET("test page2", "/page2", Page2),
        app1.NewGroup("home",
            app1.NewNamedGET("test param", "/param", &Param{
                // sets the default value in the API documentation for the request
``` **Параметры (необязательные)**

Id: 1, Title: "test param", })


- **Стиль цепочки**

```go
// Новый объект приложения, параметры: имя, версия
var app2 = faygo.New("myapp2", "1.0")

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

Завершение работы и перезагрузка

  • завершение работы корректно
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        =                         # Каталог кэша сертификатов TLS Let's Encrypt
unix_filemode          = 0666                    # Права доступа к файлам для слушателя UNIX, требуется восьмеричное число
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                 # Автоматическое перенаправление (например, `/foo/` -> `/foo`)
redirect_fixed_path       = true                 # Пытается исправить текущий путь запроса, если для него не зарегистрирован дескриптор
handle_method_not_allowed = true                 # Возвращает 405, если запрошенный метод не существует, в противном случае возвращает 404
handle_options            = true                 # Автоматический ответ на запрос OPTIONS, вы можете установить обработчик по умолчанию в Faygo
no_default_params         = false                # Если true, не присваивайте значения параметров запроса по умолчанию на основе начальных значений параметров обработчика маршрутизации
default_upload            = true                 # Автоматическая регистрация обработчика по умолчанию: /upload/*filepath
default_static            = true                 # Автоматическая регистрация обработчика по умолчанию: /static/*filepath

[xsrf]                                           # Раздел безопасности XSRF
enable        = false                            # Включено или нет
key           = faygoxsrf                        # Ключ шифрования
expire_second = 3600                             # Срок действия токена XSRF

[session]                                        # Раздел сессии
enable                 = false                   # Включено или нет
provider               = memory                  # Хранилище данных
name                   = faygosessionID          # Клиент хранит название cookie
provider_config        =                         # В соответствии с настройками разных движков разная информация о конфигурации
cookie_life_second     = 0                       # Значение по умолчанию равно 0, что является сроком жизни браузера
gc_life_second         = 300                     # Интервал между запусками GC
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                            # Путь URL
nolimit     = false                              # Если true, доступ не ограничен
real_ip     = false                              # Если верно, означает проверку реального IP посетителя
whitelist   = 192.*|202.122.246.170              # `whitelist=192.*|202.122.246.170` означает: разрешены только IP-адреса, начинающиеся с `192.` или равные `202.122.246.170`
desc        =                                    # Описание приложения
email       =                                    # Электронная почта техника
terms_url   =                                    # Условия обслуживания
license     =                                    # Лицензия, используемая API
license_url =                                    # URL страницы содержимого протокола
  • Применяется только один глобальный конфиг (config/__global__.ini). См. следующее:
[cache]                                          # Раздел кэша
enable         = false                           # Включено или нет
size_mb        = 32                              # Максимальный размер в МБ для файлового кэша, размер кэша будет установлен на минимум 512 КБ.
expire_second  = 60                              # Максимальная продолжительность кэширования

[gzip]                                           # Раздел сжатия
enable         = false                           # Включено или нет
min_length     = 20                              # Минимальная длина контента для сжатия
compress_level = 1                               # Уровень сжатия нефайловых ответов тела равен 0–9, но файлы всегда равны 9
methods        = GET                             # Список методов HTTP для сжатия. Если не установлено, сжимаются только запросы GET.

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

Теги структуры обработчика

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

param | desc | no | (e.g. id) | описание параметра запроса param | len | no | (e.g. 3:6) | диапазон длины [a, b] значения параметра param | range | no | (e. g. 0:10) | числовой диапазон [a,b] значения параметра param | nonzero | no | | значение параметра не может быть равно нулю param | maxmb | no | (например, 32) | при запросе Content-Type multipart/form-data максимальная память для тела (multi-param, в зависимости от того, что больше) param | regexp | no | (например, ^\\w+$) | проверка значения параметра с помощью регулярного выражения (значение параметра не может быть нулевым) param | err | no | (например,incorrect password format)| пользовательская ошибка для привязки или проверки

Примечания:

  • объект привязки должен быть указателем на структуру;
  • помимо *multipart.FileHeader поле структуры привязки не может быть указателем;
  • если тег param не существует, будет проанализировано анонимное поле;
  • когда позиция param (in) — formData и тип поля — *multipart.FileHeader, multipart.FileHeader, []*multipart.FileHeader или []multipart.FileHeader, param получает загруженный файл;
  • если позиция param (in) — cookie, тип поля должен быть *http.Cookie или http.Cookie;
  • теги param in(formData) и in(body) не могут существовать одновременно;
  • не должно быть более одного тега in(body).

Типы полей структуры Handler

base slice special
string []string [][]byte
byte []byte [][]uint8
uint8 []uint8 *multipart.FileHeader (только для param formData)
bool []bool []*multipart.FileHeader (только для param formData)
int []int *http.Cookie (только для net/http's cookie param)
int8 []int8 http.Cookie (только для net/http's cookie param)
int16 []int16 struct (тип структуры только для param body или как анонимное поле для расширения параметров)
int32 []int32
int64 []int64
uint8 []uint8
uint16 []uint16
uint32 []uint32
uint64 []uint64
float32 []float32
float64 []float64

Пакет расширения

Название пакета путь импорта
barcode github.com/andeya/faygo/ext/barcode
Bit unit conversion github.com/andeya/faygo/ext/bitconv
gorm(DB ORM) github.com/andeya/faygo/ext/db/gorm
sqlx(DB ext) github.com/andeya/faygo/ext/db/sqlx
xorm(DB ORM) github.com/andeya/faygo/ext/db/xorm
directSQL(Configured SQL engine) github.com/andeya/faygo/ext/db/directsql
One-time Password github.com/andeya/faygo/ext/otp
UUID github.com/andeya/faygo/ext/uuid
Websocket github.com/andeya/faygo/ext/websocket
ini github.com/andeya/faygo/ini
cron github.com/andeya/faygo/ext/cron
task github.com/andeya/faygo/ext/task
http client github.com/andeya/faygo/ext/surfer

Известные случаи

Название продукта Сервер Web/App Домашняя страница
盯房 Приложение https://www.df-house.com
eTrade Приложение Бизнес-пользователи

Лицензия

Faygo работает на условиях лицензии Apache v2. Полный текст лицензии см. в файле LICENSE.

Комментарии ( 0 )

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

Введение

Описание недоступно Развернуть Свернуть
Apache-2.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