Faygo — это быстрый и лаконичный веб-фреймворк на Go, который можно использовать для разработки высокопроизводительных веб-приложений (особенно API) с меньшим количеством кода.
Просто определите структуру Handler, и Faygo автоматически привяжет и проверит параметры запроса и сгенерирует онлайн-документацию по API.
Последняя версия
Быстрый старт
Есть два способа начать работу:
go get -u -v github.com/andeya/faygo
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 абсолютно одинаковы, оба реализуют интерфейс 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() для регистрации соответствующего пользовательского типа перед запуском). Сервис
Простой пример
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
)| пользовательская ошибка для привязки или проверки
Примечания:
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 | Приложение Бизнес-пользователи |
Pingan Technology — https://tech.pingan.com/index.html
Followme — https://www.followme.cn/
Df House — https://www.df-house.com/
Чжолнэнван Ю онлайн — http://www.zlgjjt.com/
Фэнли Цзиньфу — https://www.phonelee.com/
Лицензия
Faygo работает на условиях лицензии Apache v2. Полный текст лицензии см. в файле LICENSE.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )