Request & Response

In glim framework, requests and responses are handled by application controllers. There exists a Controller class in glim.component module that every controllers must extend. The request & response objects are just wrappers of Werkzeug's BaseRequest & BaseResponse.

Request

After a request is mapped into a controller, the request variables are automatically injected into Controller. Since all the application controllers must extend Controller class, it is not needed to set the request explicitly for each controller. The base controller class is the following;

class Controller:
    """

    The controller component is responsible for handling requests
    and returning appropriate response to the requests.

    Attributes
    ----------
      request (werkzeug.wrappers.Request): The current request
        object. This object is automatically passed by dispatch
        module.

    """
    def __init__(self, request):
        self.request = request

Simple, isn’t it? So, each controller can access the request object by self.request that is provided by werkzeug dispatcher. self.request is an alias of werkzeug.wrappers.BaseRequest object that is injected by dispatcher.

Some useful functions for Request are the following;

self.request.environ  # the wrapped wsgi environ dict
self.request.app      # bottle application object
self.request.route    # current Route object
self.request.url_args # arguments that are extracted from url
self.request.method   # request method of current route
self.request.headers  # request headers as dict
self.request.get_header(name, default=None) # retrieve header
self.request.cookies  # cookies parsed into FormsDict
self.request.get_cookie(key, default=None, secret=None) # retrieve cookie
self.request.query.<name>  # retrieve query string key
self.request.forms.<name>  # retrieve form variable
self.request.params.<name> # retrieve form & query combined vars
self.request.json # retrieve json body
self.request.body # retrieve raw body
self.request.is_xhr # flag of request triggered by XMLHttpRequest
self.request.is_ajax # flag of ajax
self.request.auth # http authentication data
self.request.remote_addr # remote ip address
self.request.remote_route # list of all ips with X-Forwarded-For header
self.request.copy() # make a shallow copy of request

A much more extensive documentation about Request objects can be found here

Response

The responses are the returned variables of any application Controller class in glim. For example;

# controllers.py
from app.models import Post
from glim import Controller
from glim import Response
from glim_extensions.db import Orm

import json

class PostController(Controller):
    def get(id):
        response = {}
        response['error'] = None
        return response
        # returns {"error": null}

This is a simple REST like web service example of a PostController. Notice that, Response is a type of werkzeug.wrappers.BaseResponse. You can also drop the use of return Response() statement and use only return json.dumps(response). Glim will understand this and create a Response for you.

🚧

Do not use string based returns in filters

Although glim can convert the string returns into Responses, it is highly suggested not to use string base returns in filters for not having ambiguous definitions.

Some useful variables for generating response;

variable

description

headers

a list of headers or a Headers object

status_code

the http status code of response

mimetype

the mimetype for the request

content_type

the content type for the request

get_header(name, default=None)

retrieve header key

set_header(name, value)

set header key - value

add_header(name, value)

add header key - value

content_type

shortcut of Content-Type

A much more extensive documentation of Response objects can be found here