Gestión de Peticiones
Contexto
En el corazón de cada gestor de peticiones de Buffalo se encuentra el contexto
. Este contexto proporciona a los controladores una definición de función simple y limpia, a la vez que es inmensamente potente.
La interfaz context
La interfaz buffalo.Context
soporta context.Context
por lo que se puede pasar y utilizar como un Contexto de Go “estándar”.
Dado que buffalo.Context
es una interfaz, es posible crear una implementación específica para la aplicación que se adapte a las necesidades de la aplicación que se está construyendo.
type Context interface {
context.Context
Response() http.ResponseWriter
Request() *http.Request
Session() *Session
Cookies() *Cookies
Params() ParamValues
Param(string) string
Set(string, interface{})
LogField(string, interface{})
LogFields(map[string]interface{})
Logger() Logger
Bind(interface{}) error
Render(int, render.Renderer) error
Error(int, error) error
Redirect(int, string, ...interface{}) error
Data() map[string]interface{}
Flash() *Flash
File(string) (binding.File, error)
}
La función Websocket() (*websocket.Conn, error)
fue eliminada de buffalo.Context
en la versión v0.12.0
. Utiliza el paquete http://www.gorillatoolkit.org/pkg/websocket en su lugar.
Contexto y renderizado
Como parte de la interfaz del contexto, hay una función Render
que toma un tipo de render.Renderer
. Revisa rendering para mayor información.
Cualquier valor que sea definido en el contexto estará automáticamente disponible para el render.Renderer
que se pasa a la función Render
.
func Hello(c buffalo.Context) error {
c.Set("name", "Mark")
return c.Render(http.StatusOK, render.String("Hi <%= name %>"))
}
Implementando la Interfaz
El buffalo.Context
no está pensado para ser implementado “totalmente”. En su lugar, se recomienda utilizar una composición y utilizar sólo las funciones de las que se desea proporcionar implementaciones personalizadas.
A continuación se muestra un ejemplo de cambio de la función Error
para registrar el error y matar la aplicación:
// actions/context.go
type MyContext struct {
buffalo.Context
}
func (my MyContext) Error(status int, err error) error {
my.Logger().Fatal(err)
return err
}
// actions/app.go
// ...
func App() *buffalo.App {
if app != nil {
// ...
app.Use(func (next buffalo.Handler) buffalo.Handler {
return func(c buffalo.Context) error {
// change the context to MyContext
return next(MyContext{c})
}
})
// ...
}
return app
}
// ...
Recorriendo los Parámetros
El método buffalo.Context#Params
devuelve buffalo.ParamValues
que es una interfaz alrededor de url.Values. Se puede hacer un casting a este tipo en el handler para recorrer los valores de los parámetros.
import "net/url"
func HomeHandler(c buffalo.Context) error {
if m, ok := c.Params().(url.Values); ok {
for k, v := range m {
fmt.Println(k, v)
}
}
return c.Render(http.StatusOK, r.HTML("index.html"))
}
Qué hay en el contexto
Buffalo añade al contexto de cada solicitud un montón de información que podría ser útil en tu aplicación, como la current_route
o la session
. A continuación se muestra una lista de lo que Buffalo añade al contexto de cada solicitud al que puedes acceder desde las acciones o plantillas.
Llave | Tipo | Uso |
---|---|---|
app |
*buffalo.App |
La aplicación actual de Buffalo que se está ejecutando. |
env |
string |
El entorno actual en el que se ejecuta la aplicación. Por ejemplo: test , development , production |
routes |
buffalo.RouteList |
Una lista de todas las rutas mapeadas en la aplicación. |
current_route |
buffalo.RouteInfo |
La ruta actual a la que se accede. |
current_path |
string |
La ruta actual solicitada. Ejemplo: /users/1/edit |
*Path |
RouteHelperFunc |
Helpers para crear caminos basados en las rutas mapeadas. Por ejemplo: editUserPath . Ejecuta buffalo task routes para ver una lista completa para tu aplicación. |
params |
map[string]string |
Parámetros de consulta de la página solicitada. |
flash |
map[string][]string |
Un mapa de mensajes establecidos mediante buffalo.Context#Flash . |
session |
*buffalo.Session |
La sesión del usuario actual. |
request |
*http.Request |
La petición actual. |
tx |
*pop.Connection |
Sólo se establece si se utiliza el middleware github.com/gobuffalo/buffalo/middleware.PopTransaction (activado por defecto). |
Consulta Helpers para obtener una lista de las funciones de ayuda integradas disponibles dentro de las plantillas.