Skip to main content

granian

The Rust HTTP server for Python


Granian is a Rust HTTP server for Python applications built on top of Hyper and Tokio.

Rationale

The main reasons behind Granian design are:

  • Have a single, correct HTTP implementation, supporting versions 1, 2 (and eventually 3)
  • Provide a single package for several platforms
  • Avoid the usual Gunicorn + uvicorn + http-tools dependency composition on unix systems
  • Provide stable performance when compared to existing alternatives

Adopting Granian would thus be a good choice when:

  • wanting a modern, single dependency to serve both ASGI and WSGI applications
  • looking for the most performant way to serve your Python application under HTTP/2
  • you need great concurrency capabilities, especially with websockets
  • you care about throughput more than everything else

On the other hand, Granian won't be the ideal option if:

  • you want a pure Python solution
  • you need advanced debugging features
  • your application relies on trio or gevent
  • you're looking for ASGI extensions not (yet) implemented

Features

  • Supports ASGI/3, RSGI and WSGI interface applications
  • HTTP/1 and HTTP/2 protocols
  • HTTPS and mTLS
  • Websockets
  • Direct static files serving
  • ASGI pathsend extension

Quickstart

You can install Granian using pip:

$ pip install granian

ASGI

Create an application in your main.py:

async def app(scope, receive, send):
    assert scope['type'] == 'http'

    await send({
        'type': 'http.response.start',
        'status': 200,
        'headers': [
            [b'content-type', b'text/plain'],
        ],
    })
    await send({
        'type': 'http.response.body',
        'body': b'Hello, world!',
    })

and serve it using Granian CLI:

$ granian --interface asgi main:app

RSGI

Create an application your main.py:

async def app(scope, proto):
    assert scope.proto == 'http'

    proto.response_str(
        status=200,
        headers=[
            ('content-type', 'text/plain')
        ],
        body="Hello, world!"
    )

and serve it using Granian CLI:

$ granian --interface rsgi main:app

WSGI

Create an application your main.py:

def app(environ, start_response):
    start_response('200 OK', [('content-type', 'text/plain')])
    return [b"Hello, world!"]

and serve it using Granian CLI:

$ granian --interface wsgi main:app

Extra dependencies

Mind that Granian also provides several extra dependencies you might be interested into, in particular:

  • dotenv (allows to load environment files)
  • pname (allows to customize processes' names)
  • reload (adds reload on changes functionality)
  • rloop
  • uvloop
  • winloop

You can combine the above extras to suit your needs, eg:

$ pip install granian[pname,uvloop]

For further information, check the options below.

Options

You can check all the options provided by Granian with the --help command:

$ granian --help
Usage: granian [OPTIONS] APP

  APP  Application target to serve.  [required]

Options:
  --host TEXT                     Host address to bind to  [env var:
                                  GRANIAN_HOST; default: (127.0.0.1)]
  --port INTEGER                  Port to bind to.  [env var: GRANIAN_PORT;
                                  default: 8000]
  --uds PATH                      Unix Domain Socket to bind to.  [env var:
                                  GRANIAN_UDS]
  --uds-permissions OCTAL INTEGER
                                  Unix Domain Socket file permissions  [env
                                  var: GRANIAN_UDS_PERMISSIONS]
  --interface [asgi|asginl|rsgi|wsgi]
                                  Application interface type  [env var:
                                  GRANIAN_INTERFACE; default: (rsgi)]
  --http [auto|1|2]               HTTP version  [env var: GRANIAN_HTTP;
                                  default: (auto)]
  --ws / --no-ws                  Enable websockets handling  [env var:
                                  GRANIAN_WEBSOCKETS; default: (enabled)]
  --workers INTEGER RANGE         Number of worker processes  [env var:
                                  GRANIAN_WORKERS; default: 1; x>=1]
  --blocking-threads INTEGER RANGE
                                  Number of blocking threads (per worker)
                                  [env var: GRANIAN_BLOCKING_THREADS; x>=1]
  --blocking-threads-idle-timeout DURATION
                                  The maximum amount of time in seconds (or a
                                  human-readable duration) an idle blocking
                                  thread will be kept alive  [env var:
                                  GRANIAN_BLOCKING_THREADS_IDLE_TIMEOUT;
                                  default: 30; 5<=x<=600]
  --runtime-threads INTEGER RANGE
                                  Number of runtime threads (per worker)  [env
                                  var: GRANIAN_RUNTIME_THREADS; default: 1;
                                  x>=1]
  --runtime-blocking-threads INTEGER RANGE
                                  Number of runtime I/O blocking threads (per
                                  worker)  [env var:
                                  GRANIAN_RUNTIME_BLOCKING_THREADS; x>=1]
  --runtime-mode [auto|mt|st]     Runtime mode to use (single/multi threaded)
                                  [env var: GRANIAN_RUNTIME_MODE; default:
                                  (auto)]
  --loop [auto|asyncio|rloop|uvloop|winloop]
                                  Event loop implementation  [env var:
                                  GRANIAN_LOOP; default: (auto)]
  --task-impl [asyncio|rust]      Async task implementation to use  [env var:
                                  GRANIAN_TASK_IMPL; default: (asyncio)]
  --backlog INTEGER RANGE         Maximum number of connections to hold in
                                  backlog (globally)  [env var:
                                  GRANIAN_BACKLOG; default: 1024; x>=128]
  --backpressure INTEGER RANGE    Maximum number of requests to process
                                  concurrently (per worker)  [env var:
                                  GRANIAN_BACKPRESSURE; default:
                                  (backlog/workers); x>=1]
  --http1-buffer-size INTEGER RANGE
                                  Sets the maximum buffer size for HTTP/1
                                  connections  [env var:
                                  GRANIAN_HTTP1_BUFFER_SIZE; default: 417792;
                                  x>=8192]
  --http1-header-read-timeout INTEGER RANGE
                                  Sets a timeout (in milliseconds) to read
                                  headers  [env var:
                                  GRANIAN_HTTP1_HEADER_READ_TIMEOUT; default:
                                  30000; 1<=x<=60000]
  --http1-keep-alive / --no-http1-keep-alive
                                  Enables or disables HTTP/1 keep-alive  [env
                                  var: GRANIAN_HTTP1_KEEP_ALIVE; default:
                                  (enabled)]
  --http1-pipeline-flush / --no-http1-pipeline-flush
                                  Aggregates HTTP/1 flushes to better support
                                  pipelined responses (experimental)  [env
                                  var: GRANIAN_HTTP1_PIPELINE_FLUSH; default:
                                  (disabled)]
  --http2-adaptive-window / --no-http2-adaptive-window
                                  Sets whether to use an adaptive flow control
                                  for HTTP2  [env var:
                                  GRANIAN_HTTP2_ADAPTIVE_WINDOW; default:
                                  (disabled)]
  --http2-initial-connection-window-size INTEGER RANGE
                                  Sets the max connection-level flow control
                                  for HTTP2  [env var: GRANIAN_HTTP2_INITIAL_C
                                  ONNECTION_WINDOW_SIZE; default: 1048576;
                                  x>=1024]
  --http2-initial-stream-window-size INTEGER RANGE
                                  Sets the `SETTINGS_INITIAL_WINDOW_SIZE`
                                  option for HTTP2 stream-level flow control
                                  [env var:
                                  GRANIAN_HTTP2_INITIAL_STREAM_WINDOW_SIZE;
                                  default: 1048576; x>=1024]
  --http2-keep-alive-interval INTEGER RANGE
                                  Sets an interval (in milliseconds) for HTTP2
                                  Ping frames should be sent to keep a
                                  connection alive  [env var:
                                  GRANIAN_HTTP2_KEEP_ALIVE_INTERVAL;
                                  1<=x<=60000]
  --http2-keep-alive-timeout DURATION
                                  Sets a timeout (in seconds or a human-
                                  readable duration) for receiving an
                                  acknowledgement of the HTTP2 keep-alive ping
                                  [env var: GRANIAN_HTTP2_KEEP_ALIVE_TIMEOUT;
                                  default: 20; x>=1]
  --http2-max-concurrent-streams INTEGER RANGE
                                  Sets the SETTINGS_MAX_CONCURRENT_STREAMS
                                  option for HTTP2 connections  [env var:
                                  GRANIAN_HTTP2_MAX_CONCURRENT_STREAMS;
                                  default: 200; x>=10]
  --http2-max-frame-size INTEGER RANGE
                                  Sets the maximum frame size to use for HTTP2
                                  [env var: GRANIAN_HTTP2_MAX_FRAME_SIZE;
                                  default: 16384; x>=1024]
  --http2-max-headers-size INTEGER RANGE
                                  Sets the max size of received header frames
                                  [env var: GRANIAN_HTTP2_MAX_HEADERS_SIZE;
                                  default: 16777216; x>=1]
  --http2-max-send-buffer-size INTEGER RANGE
                                  Set the maximum write buffer size for each
                                  HTTP/2 stream  [env var:
                                  GRANIAN_HTTP2_MAX_SEND_BUFFER_SIZE; default:
                                  409600; x>=1024]
  --log / --no-log                Enable logging  [env var:
                                  GRANIAN_LOG_ENABLED; default: (enabled)]
  --log-level [critical|error|warning|warn|info|debug|notset]
                                  Log level  [env var: GRANIAN_LOG_LEVEL;
                                  default: (info)]
  --log-config FILE               Logging configuration file (json)  [env var:
                                  GRANIAN_LOG_CONFIG]
  --access-log / --no-access-log  Enable access log  [env var:
                                  GRANIAN_LOG_ACCESS_ENABLED; default:
                                  (disabled)]
  --access-log-fmt TEXT           Access log format  [env var:
                                  GRANIAN_LOG_ACCESS_FMT]
  --ssl-certificate FILE          SSL certificate file  [env var:
                                  GRANIAN_SSL_CERTIFICATE]
  --ssl-keyfile FILE              SSL key file (PKCS#8 format only)  [env var:
                                  GRANIAN_SSL_KEYFILE]
  --ssl-keyfile-password TEXT     SSL key password  [env var:
                                  GRANIAN_SSL_KEYFILE_PASSWORD]
  --ssl-protocol-min [tls1.2|tls1.3]
                                  Set the minimum supported protocol for SSL
                                  connections.  [env var:
                                  GRANIAN_SSL_PROTOCOL_MIN; default: (tls1.3)]
  --ssl-ca FILE                   Root SSL cerificate file for client
                                  verification  [env var: GRANIAN_SSL_CA]
  --ssl-crl FILE                  SSL CRL file(s)  [env var: GRANIAN_SSL_CRL]
  --ssl-client-verify / --no-ssl-client-verify
                                  Verify clients SSL certificates  [env var:
                                  GRANIAN_SSL_CLIENT_VERIFY; default:
                                  (disabled)]
  --url-path-prefix TEXT          URL path prefix the app is mounted on  [env
                                  var: GRANIAN_URL_PATH_PREFIX]
  --respawn-failed-workers / --no-respawn-failed-workers
                                  Enable workers respawn on unexpected exit
                                  [env var: GRANIAN_RESPAWN_FAILED_WORKERS;
                                  default: (disabled)]
  --respawn-interval FLOAT        The number of seconds to sleep between
                                  workers respawn  [env var:
                                  GRANIAN_RESPAWN_INTERVAL; default: 3.5]
  --rss-sample-interval DURATION  The sample rate in seconds (or a human-
                                  readable duration) for the resource monitor
                                  [env var: GRANIAN_RSS_SAMPLE_INTERVAL;
                                  default: 30; 1<=x<=300]
  --rss-samples INTEGER RANGE     The number of consecutive samples to
                                  consider a worker over resource limit  [env
                                  var: GRANIAN_RSS_SAMPLES; default: 1; x>=1]
  --workers-lifetime DURATION     The maximum amount of time in seconds (or a
                                  human-readable duration) a worker will be
                                  kept alive before respawn  [env var:
                                  GRANIAN_WORKERS_LIFETIME; x>=60]
  --workers-max-rss INTEGER RANGE
                                  The maximum amount of memory (in MiB) a
                                  worker can consume before respawn  [env var:
                                  GRANIAN_WORKERS_MAX_RSS; x>=1]
  --workers-kill-timeout DURATION
                                  The amount of time in seconds (or a human-
                                  readable duration) to wait for killing
                                  workers that refused to gracefully stop
                                  [env var: GRANIAN_WORKERS_KILL_TIMEOUT;
                                  default: (disabled); 1<=x<=1800]
  --factory / --no-factory        Treat target as a factory function, that
                                  should be invoked to build the actual target
                                  [env var: GRANIAN_FACTORY; default:
                                  (disabled)]
  --working-dir DIRECTORY         Set the working directory  [env var:
                                  GRANIAN_WORKING_DIR]
  --env-files FILE                Environment file(s) to load (requires
                                  granian[dotenv] extra)  [env var:
                                  GRANIAN_ENV_FILES]
  --static-path-route TEXT        Route(s) for static file serving  [env var:
                                  GRANIAN_STATIC_PATH_ROUTE; default:
                                  (/static)]
  --static-path-mount DIRECTORY   Path(s) to mount for static file serving
                                  [env var: GRANIAN_STATIC_PATH_MOUNT]
  --static-path-dir-to-file TEXT  Serve the specified file as the index for
                                  directory listings  [env var:
                                  GRANIAN_STATIC_PATH_DIR_TO_FILE]
  --static-path-expires DURATION  Cache headers expiration (in seconds or a
                                  human-readable duration) for static file
                                  serving. 0 to disable.  [env var:
                                  GRANIAN_STATIC_PATH_EXPIRES; default: 86400;
                                  x>=0]
  --metrics / --no-metrics        Enable the prometheus metrics exporter.
                                  [env var: GRANIAN_METRICS_ENABLED; default:
                                  (disabled)]
  --metrics-scrape-interval DURATION
                                  Configure the interval for metrics
                                  collection.  [env var:
                                  GRANIAN_METRICS_SCRAPE_INTERVAL; default:
                                  15; 1<=x<=60]
  --metrics-address TEXT          Metrics exporter host address to bind to
                                  [env var: GRANIAN_METRICS_ADDRESS; default:
                                  (127.0.0.1)]
  --metrics-port INTEGER          Metrics exporter port to bind to.  [env var:
                                  GRANIAN_METRICS_PORT; default: 9090]
  --reload / --no-reload          Enable auto reload on application's files
                                  changes (requires granian[reload] extra)
                                  [env var: GRANIAN_RELOAD; default:
                                  (disabled)]
  --reload-paths PATH             Paths to watch for changes  [env var:
                                  GRANIAN_RELOAD_PATHS; default: (Working
                                  directory)]
  --reload-ignore-dirs TEXT       Names of directories to ignore changes for.
                                  Extends the default list of directories to
                                  ignore in watchfiles' default filter  [env
                                  var: GRANIAN_RELOAD_IGNORE_DIRS]
  --reload-ignore-patterns TEXT   File/directory name patterns (regex) to
                                  ignore changes for. Extends the default list
                                  of patterns to ignore in watchfiles' default
                                  filter  [env var:
                                  GRANIAN_RELOAD_IGNORE_PATTERNS]
  --reload-ignore-paths PATH      Absolute paths to ignore changes for  [env
                                  var: GRANIAN_RELOAD_IGNORE_PATHS]
  --reload-tick INTEGER RANGE     The tick frequency (in milliseconds) the
                                  reloader watch for changes  [env var:
                                  GRANIAN_RELOAD_TICK; default: 50;
                                  50<=x<=5000]
  --reload-ignore-worker-failure / --no-reload-ignore-worker-failure
                                  Ignore worker failures when auto reload is
                                  enabled  [env var:
                                  GRANIAN_RELOAD_IGNORE_WORKER_FAILURE;
                                  default: (disabled)]
  --process-name TEXT             Set a custom name for processes (requires
                                  granian[pname] extra)  [env var:
                                  GRANIAN_PROCESS_NAME]
  --pid-file FILE                 A path to write the PID file to  [env var:
                                  GRANIAN_PID_FILE]
  --version                       Show the version and exit.
  --help                          Show this message and exit.

Human-readable durations

Whenever Granian accepts a duration, it can be specified either as sole number, in which case it is interpreted as a number of seconds, or using one of the following suffixes:

suffix meaning
s seconds (same as no suffix)
m minutes
h hours
d days

Logging

Despite being a Rust project, Granian is a good Python citizen and uses the standard library's logging module to produce logs. This means you can freely configure your logging level and format using the standard idioms you probably familiar with.

As many other web servers, Granian uses two different loggers, specifically:

  • the _granian logger for runtime messages
  • the granian.access logger for access logs

Access log format

The access log format can be configured by specifying the atoms (see below) to include in a specific format. By default Granian will use [%(time)s] %(addr)s - "%(method)s %(path)s %(protocol)s" %(status)d %(dt_ms).3f as the format.

Access log atoms

The following atoms are available for use:

identifier description
addr Client remote address
time Datetime of the request
dt_ms Request duration in ms
status HTTP response status
path Request path (without query string)
query_string Request query string
method Request HTTP method
scheme Request scheme
protocol HTTP protocol version
header{header-name} Request header value for the provided (case insensitive) header-name

Workers and threads

Granian offers different options to configure the number of workers and threads to be run, in particular:

  • workers: the total number of processes holding a dedicated Python interpreter that will run the application
  • blocking threads: the number of threads per worker interacting with the Python interpreter
  • runtime threads: the number of Rust threads per worker that will perform network I/O
  • runtime blocking threads: the number of Rust threads per worker involved in blocking operations. The main role of these threads is dealing with blocking I/O – like file system operations.

In general, Granian will try its best to automatically pick proper values for the threading configuration, leaving to you the responsibility to choose the number of workers you need.
There is no golden rule here, as these numbers will vastly depend both on your application behavior and the deployment target, but we can list some suggestions:

  • matching the amount of CPU cores for the workers is generally the best starting point; on containerized environments like docker or k8s is best to have 1 worker per container though and scale your containers using the relevant orchestrator;
  • the default number of runtime threads and runtime blocking threads is fine for the vast majority of applications out there; you might want to increase the first for applications dealing with several concurrently opened websockets or if you primarily use HTTP/2, and lowering the second only if you serve the same few files to a lot of connections;

In regards of blocking threads, the option is irrelevant on asynchronous protocols, as all the interop will happen with the AsyncIO event loop which will also be the one holding the GIL for the vast majority of the time, and thus the value is fixed to a single thread; on synchronous protocols like WSGI instead, it will be the maximum amount of threads interacting – and thus trying to acquire the GIL – with your application code. All those threads will be spawned on-demand depending on the amount of concurrency, and they'll be shutdown after the amount of inactivity time specified with the relevant setting.
In general, and unless you have a very specific use-case to do so (for example, if your application have an average millisecond response, a very limited amount of blocking threads usually delivers better throughput) you should avoid to tune this threadpool size and configure a backpressure value that suits your needs instead. In that regards, please check the next section.

Also, you should generally avoid to configure workers and threads based on numbers suggested for other servers, as Granian architecture is quite different from projects like Gunicorn or Uvicorn.

Note: using multiple workers and respawn options (lifetime, max memory) on Linux requires kernel versions >= 5.14 and the net.ipv4.tcp_migrate_req syctl option enabled. Otherwise, during workers respawns, queued connections in the backlog might be dropped.

Backpressure

Since Granian runs a separated Rust runtime aside of your application that will handle I/O and "send work" to the Python interpreter, a mechanism to avoid pushing more work that what the Python interpreter can actually do is provided: backpressure.

Backpressure in Granian operates at the single worker's connections accept loop, practically interrupting the loop in case too many requests are waiting to be processed down the line. It is a per-worker concurrency limiter: connections exceeding the configured value will wait in the worker's own socket queue – the network stack backlog provided by the OS kernel (and configured with the apposite parameter).

While on asynchronous protocols, the default value for the backpressure should work fine for the vast majority of applications, as work will be handled and suspended by the AsyncIO event loop, on synchronous protocols there's no way to predict the amount of interrupts (and thus GIL releases) your application would do on a single request, and thus you should configure a value that makes sense in your environment. For example, if your WSGI application never does I/O within a request-reponse flow, then you can't really go beyond serial, and thus any backpressure value above 2 wouldn't probably make any difference, as all the requests will just be waiting to acquire the GIL in order to be processed. On the other hand, if your application makes external network requests within the standard request-response flow, a large backpressure can help, as during the time spent on those code paths you can still process other requests. Another example would be if your application communicate with a database, and you have a limited amount of connections that can be opened to that database: in this case setting the backpressure to that value would definitely be the best option.

In general, think of backpressure as the maximum amount of concurrency you want to handle (per worker) in your application, after which Granian will halt and wait before pushing more work.

Warning: since backpressure interacts with the accept loop, it will limit connections, not the single requests. Keep-alive connections will handle multiple requests within a single connection, but Granian won't count those requests in the actual pressure. This also means, if you typically have several long-running keep-alive connections to your service (for example, if you run behind a reverse proxy), a backpressure value can prevent Granian to accept new connections once the amount of keep-alive connections reaches that limit. Under this circumstances, you want to ensure the configured backpressure is higher than the expected amount of keep-alive connections, and if you're trying to limit the concurrency, it's probably better to configure the blocking threads number rather than the backpressure itself.

Runtime mode

Granian offers two different runtime threading paradigms, due to the fact the runtime can be multi-threaded – in opposition to what happens in Python event-loop which can only run as a single thread.

Given you specify N threads with the relevant option, in st mode Granian will spawn N single-threaded Rust runtimes, while in mt mode Granian will spawn a single multi-threaded runtime with N threads.

Benchmarks suggests st mode to be more efficient with a small amount of processes, while mt mode seems to scale more efficiently where you have a large number of CPUs. Real performance will though depend on specific application code, and thus your mileage might vary.

By default (auto mode), Granian will pick the best option based on the rest of its configuration.

Metrics

Granian exposes the following runtime metrics in Prometheus format. All the metrics are prefixed with granian_, and the ones marked with worker scope are tagged with a worker label containing the worker ID.

metric name type unit scope description
workers_spawns counter absolute number global Number of times Granian spawned a worker
workers_respawns_for_err counter absolute number global Number of times Granian respawned a worker due to an error
workers_respawns_for_lifetime counter absolute number global Number of times Granian respawned a worker due to exceeding lifetime
workers_respawns_for_rss counter absolute number global Number of times Granian respawned a worker due to exceeding resources usage
workers_respawns_for_lifetime counter absolute number global Number of times Granian respawned a worker due to exceeding lifetime
worker_lifetime counter seconds worker Current lifetime of the worker
connections_active gauge absolute number worker Number of active connections
connections_handled counter absolute number worker Number of accepted connections
connections_err gauge absolute number worker Number of failed connections
requests_handled counter absolute number worker Number of processed requests
static_requests_handled counter absolute number worker Number of processed requests for static files
static_requests_err counter absolute number worker Number of requests for static files resulted in a non 200 response code
blocking_threads gauge absolute number worker Current number of blocking threads in the pool (on async protocols this is always 1)
blocking_queue gauge absolute number worker Number of pending tasks for the blocking threadpool
blocking_idle_cumulative counter microseconds worker Cumulative idle time spent in the blocking threadpool
blocking_busy_cumulative counter microseconds worker Cumulative busy time spent in the blocking threadpool
py_wait_cumulative counter microseconds worker Cumulative time spent waiting on GIL (on the free-threaded build this is always 0)

Static files

Granian offers the ability to offload static files serving directly to the server, without calling your Python application in the process.

The --static-path-route and --static-path-mount options accept multiple values, thus you can serve an arbitrary number of static locations in your application, the only condition being the number of routes and mounts specified should be the same:

$ granian \
    --static-path-route /static \
    --static-path-mount assets/static \
    --static-path-route /media \
    --static-path-mount assets/media \
    package:app

Serving a specific file for directory listings

Granian also provides the option to rewrite a static location pointing to a directory to a file contained in such directory. This allows you to serve, for example, an index.html file in the static path tree:

$ granian \
    --static-path-route /docs \
    --static-path-mount generated/docs \
    --static-path-dir-to-file index.html \
    package:app

Note: while Granian performs a rewrite on the target directory, the file will still be served if the request path points to it directly (in the example above, requests pointing to /docs/somefolder and /docs/somefolder/index.html will both respond with the contents of index.html – if present). Also, the option will enable this behavior on all the static paths defined.

Proxies and forwarded headers

Since none of the supported applications protocols define a strategy for proxies' forwarded headers, Granian doesn't provide any option to configure its behaviour around them.

What Granian provides instead, for contexts in which is being run behind a reverse proxy, are wrappers you can use on top of your application, in order to alter the request scope based on the headers forwarded by the proxy itself. You can find such wrappers in the granian.utils.proxies module:

from granian.utils.proxies import wrap_asgi_with_proxy_headers, wrap_wsgi_with_proxy_headers

async def my_asgi_app(scope, receive, send):
    ...

def my_wsgi_app(environ, start_response):
    ...

my_asgi_app = wrap_asgi_with_proxy_headers(my_asgi_app, trusted_hosts="1.2.3.4")
my_wsgi_app = wrap_wsgi_with_proxy_headers(my_wsgi_app, trusted_hosts="1.2.3.4")

With these wrappers, Granian will use:

and replace the relevant request scope attributes with these values.

Since altering the request scope based on values from headers is security-sensitive, Granian will check the request is coming from a trusted host as specified by the trusted_hosts argument. By default this value is set to 127.0.0.1, which means Granian will only intercept those headers if the proxy resides on the same machine, but most likely that's not the case in a production environment: you should thus provide the correct set of addresses to the wrappers.

The trusted_hosts argument accepts either a string or a list of strings, where valid values are IP addresses (for example, 192.0.2.1 or fd12:3456:789a::1) and CIDR ranges (for example, 192.0.2.0/24 or 2001:db8:abcd::/48). The special catch-all value "*" (or ["*"]) will make Granian trust all hosts and effectively disable the security check.

Free-threaded Python

Warning: free-threaded Python support is still experimental and highly discouraged in production environments.

Since version 2.0 Granian supports free-threaded Python. While the installation process remains the same, as wheels for the free-threaded version are published separately, here we list some key differences from the GIL version.

  • Workers are threads instead of separated processes, so there will always be a single Python interpreter running
  • The application is thus loaded a single time and shared between workers
  • In asynchronous protocols like ASGI and RSGI each worker runs its own AsyncIO event loop like the GIL version, but the loop will run in the worker thread instead of the Python main thread

Note: if for any reason the GIL gets enabled on the free-threaded build, Granian will refuse to start. This means you can't use the free-threaded build on GIL enabled interpreters.

While for asynchronous protocols nothing really changes in terms of workers and threads configuration, as the scaling will be still driven by the number of AsyncIO event loops running (so the same rules for GIL workers apply), on synchronous protocols like WSGI every GIL-related limitation is theoretically absent.
While the general rules in terms of I/O-bound vs CPU-bound load still apply, at the time being there's not enough data to make suggestions in terms of workers and threads tuning in the free-threaded Python land, and thus you will need to experiment with those values depending on your specific workload.

Customising Granian

Running Granian directly from Python instead of its CLI gives you access to some customization interfaces that let you alter its standard behaviour.

AsyncIO event loop initialization

As soon as you run Granian directly from Python instead of its CLI, you can customise the default event loop initialisation policy by overwriting the auto policy. Let's say, for instance, you want to use the selector event loop on Windows:

import asyncio
from granian import Granian, loops

@loops.register('auto')
def build_loop():
    asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
    return asyncio.new_event_loop()


Granian(...).serve()

Hooks

Granian provides hooks registration interfaces to run code during specific phases of its lifecycle. Specifically, you have the following methods available:

  • on_startup
  • on_shutdown
  • on_reload

The mentioned methods accept a callable with no arguments that will be invoked during the relevant lifecycle phases. You can register your hooks simply passing them to the relevant method:

from granian import Granian

def my_hook():
    print("hello from reload!")

server = Granian(...)
server.on_reload(my_hook)

Embedding Granian in your project

For projects requiring advance lifecycle management, or implementing their own process management strategy, Granian provides an embeddable server implementation, which provides async interfaces and won't spawn workers as processes or threads, but will run them as AsyncIO tasks.

Warning: the embeddable server is still experimental.

Note: the embeddable server only supports async protocols, thus WSGI is not supported. It's also limited to a single worker, as it runs over an existing event loop.

To embed Granian in your project, you can import the server from the relevant module:

from granian.server.embed import Server

server = Server(my_app, interface="asgi")

async def my_main():
    await server.serve()

Note: as you might already figured out, the embed server accepts the application object as its first argument, instead of the import target string of the standard servers.

Given the serve method is now async, the embeddable server also provides two methods to manage its lifecycle, specifically:

  • stop
  • reload

The idea is that you can spawn the server as a task, and later on interact with it in your own process loop:

async def my_main():
    server_task = asyncio.create_task(server.serve())
    await my_logic()
    server.stop()
    await server_task

Project status

Granian is being actively maintained and is compatible with Python 3.10 and above versions.

Granian follows a semantic versioning scheme for its releases, with a {major}.{minor}.{patch} scheme for versions numbers, where:

  • major versions might introduce breaking changes
  • minor versions introduce new features and backward compatible changes
  • patch versions only introduce bug and security fixes

Mind that bug and security fixes are usually provided for the latest minor version only.

Granian is used in production by projects like paperless-ngx, reflex, searxng and Weblate, and by companies like Microsoft, Mozilla and Sentry.

License

Granian is released under the BSD License.

Metadata

Release files for granian 2.8.4

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for granian 2.8.4
File Size Uploaded
granian-2.8.4.tar.gz 130.5 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for granian 2.8.4
File
granian-2.8.4-pp311-pypy311_pp73-win_amd64.whl PyPy 3.11 PyPy 3.11 7.3 Windows x86-64 Details
granian-2.8.4-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl PyPy 3.11 PyPy 3.11 7.3 Linux musl 1.1+ x86-64 Details
granian-2.8.4-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl PyPy 3.11 PyPy 3.11 7.3 Linux musl 1.1+ ARMv7l Details
granian-2.8.4-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl PyPy 3.11 PyPy 3.11 7.3 Linux musl 1.1+ ARM64 Details
granian-2.8.4-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl PyPy 3.11 PyPy 3.11 7.3 Linux glibc 2.28+ ARM64 Details
granian-2.8.4-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl PyPy 3.11 PyPy 3.11 7.3 Linux glibc 2.17+ x86-64 Details
granian-2.8.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl PyPy 3.11 PyPy 3.11 7.3 macOS 11.0+ ARM64 Details
granian-2.8.4-pp311-pypy311_pp73-macosx_10_12_x86_64.whl PyPy 3.11 PyPy 3.11 7.3 macOS 10.12+ x86-64 Details
granian-2.8.4-cp315-cp315t-win_amd64.whl CPython 3.15 CPython 3.15 free-threading Windows x86-64 Details
granian-2.8.4-cp315-cp315t-musllinux_1_1_x86_64.whl CPython 3.15 CPython 3.15 free-threading Linux musl 1.1+ x86-64 Details
granian-2.8.4-cp315-cp315t-musllinux_1_1_armv7l.whl CPython 3.15 CPython 3.15 free-threading Linux musl 1.1+ ARMv7l Details
granian-2.8.4-cp315-cp315t-musllinux_1_1_aarch64.whl CPython 3.15 CPython 3.15 free-threading Linux musl 1.1+ ARM64 Details
granian-2.8.4-cp315-cp315t-manylinux_2_28_aarch64.whl CPython 3.15 CPython 3.15 free-threading Linux glibc 2.28+ ARM64 Details
granian-2.8.4-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.15 CPython 3.15 free-threading Linux glibc 2.17+ x86-64 Details
granian-2.8.4-cp315-cp315t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl CPython 3.15 CPython 3.15 free-threading Linux glibc 2.17+ ARMv7l Details
granian-2.8.4-cp315-cp315t-manylinux_2_12_i686.manylinux2010_i686.whl CPython 3.15 CPython 3.15 free-threading Linux glibc 2.12+ x86-32 Details
granian-2.8.4-cp315-cp315t-macosx_11_0_arm64.whl CPython 3.15 CPython 3.15 free-threading macOS 11.0+ ARM64 Details
granian-2.8.4-cp315-cp315t-macosx_10_12_x86_64.whl CPython 3.15 CPython 3.15 free-threading macOS 10.12+ x86-64 Details
granian-2.8.4-cp315-cp315-win_amd64.whl CPython 3.15 CPython 3.15 Windows x86-64 Details
granian-2.8.4-cp315-cp315-musllinux_1_1_x86_64.whl CPython 3.15 CPython 3.15 Linux musl 1.1+ x86-64 Details
granian-2.8.4-cp315-cp315-musllinux_1_1_armv7l.whl CPython 3.15 CPython 3.15 Linux musl 1.1+ ARMv7l Details
granian-2.8.4-cp315-cp315-musllinux_1_1_aarch64.whl CPython 3.15 CPython 3.15 Linux musl 1.1+ ARM64 Details
granian-2.8.4-cp315-cp315-manylinux_2_28_aarch64.whl CPython 3.15 CPython 3.15 Linux glibc 2.28+ ARM64 Details
granian-2.8.4-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.15 CPython 3.15 Linux glibc 2.17+ x86-64 Details
granian-2.8.4-cp315-cp315-manylinux_2_17_i686.manylinux2014_i686.whl CPython 3.15 CPython 3.15 Linux glibc 2.17+ x86-32 Details
granian-2.8.4-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl CPython 3.15 CPython 3.15 Linux glibc 2.17+ ARMv7l Details
granian-2.8.4-cp315-cp315-macosx_11_0_arm64.whl CPython 3.15 CPython 3.15 macOS 11.0+ ARM64 Details
granian-2.8.4-cp315-cp315-macosx_10_12_x86_64.whl CPython 3.15 CPython 3.15 macOS 10.12+ x86-64 Details
granian-2.8.4-cp314-cp314t-win_amd64.whl CPython 3.14 CPython 3.14 free-threading Windows x86-64 Details
granian-2.8.4-cp314-cp314t-musllinux_1_1_x86_64.whl CPython 3.14 CPython 3.14 free-threading Linux musl 1.1+ x86-64 Details
granian-2.8.4-cp314-cp314t-musllinux_1_1_armv7l.whl CPython 3.14 CPython 3.14 free-threading Linux musl 1.1+ ARMv7l Details
granian-2.8.4-cp314-cp314t-musllinux_1_1_aarch64.whl CPython 3.14 CPython 3.14 free-threading Linux musl 1.1+ ARM64 Details
granian-2.8.4-cp314-cp314t-manylinux_2_28_aarch64.whl CPython 3.14 CPython 3.14 free-threading Linux glibc 2.28+ ARM64 Details
granian-2.8.4-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.14 CPython 3.14 free-threading Linux glibc 2.17+ x86-64 Details
granian-2.8.4-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl CPython 3.14 CPython 3.14 free-threading Linux glibc 2.17+ ARMv7l Details
granian-2.8.4-cp314-cp314t-manylinux_2_12_i686.manylinux2010_i686.whl CPython 3.14 CPython 3.14 free-threading Linux glibc 2.12+ x86-32 Details
granian-2.8.4-cp314-cp314t-macosx_11_0_arm64.whl CPython 3.14 CPython 3.14 free-threading macOS 11.0+ ARM64 Details
granian-2.8.4-cp314-cp314t-macosx_10_12_x86_64.whl CPython 3.14 CPython 3.14 free-threading macOS 10.12+ x86-64 Details
granian-2.8.4-cp314-cp314-win_amd64.whl CPython 3.14 CPython 3.14 Windows x86-64 Details
granian-2.8.4-cp314-cp314-musllinux_1_1_x86_64.whl CPython 3.14 CPython 3.14 Linux musl 1.1+ x86-64 Details
granian-2.8.4-cp314-cp314-musllinux_1_1_armv7l.whl CPython 3.14 CPython 3.14 Linux musl 1.1+ ARMv7l Details
granian-2.8.4-cp314-cp314-musllinux_1_1_aarch64.whl CPython 3.14 CPython 3.14 Linux musl 1.1+ ARM64 Details
granian-2.8.4-cp314-cp314-manylinux_2_28_aarch64.whl CPython 3.14 CPython 3.14 Linux glibc 2.28+ ARM64 Details
granian-2.8.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.14 CPython 3.14 Linux glibc 2.17+ x86-64 Details
granian-2.8.4-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl CPython 3.14 CPython 3.14 Linux glibc 2.17+ x86-32 Details
granian-2.8.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl CPython 3.14 CPython 3.14 Linux glibc 2.17+ ARMv7l Details
granian-2.8.4-cp314-cp314-macosx_11_0_arm64.whl CPython 3.14 CPython 3.14 macOS 11.0+ ARM64 Details
granian-2.8.4-cp314-cp314-macosx_10_12_x86_64.whl CPython 3.14 CPython 3.14 macOS 10.12+ x86-64 Details
granian-2.8.4-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details
granian-2.8.4-cp313-cp313-musllinux_1_1_x86_64.whl CPython 3.13 CPython 3.13 Linux musl 1.1+ x86-64 Details
granian-2.8.4-cp313-cp313-musllinux_1_1_armv7l.whl CPython 3.13 CPython 3.13 Linux musl 1.1+ ARMv7l Details
granian-2.8.4-cp313-cp313-musllinux_1_1_aarch64.whl CPython 3.13 CPython 3.13 Linux musl 1.1+ ARM64 Details
granian-2.8.4-cp313-cp313-manylinux_2_28_aarch64.whl CPython 3.13 CPython 3.13 Linux glibc 2.28+ ARM64 Details
granian-2.8.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.17+ x86-64 Details
granian-2.8.4-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl CPython 3.13 CPython 3.13 Linux glibc 2.17+ x86-32 Details
granian-2.8.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl CPython 3.13 CPython 3.13 Linux glibc 2.17+ ARMv7l Details
granian-2.8.4-cp313-cp313-macosx_11_0_arm64.whl CPython 3.13 CPython 3.13 macOS 11.0+ ARM64 Details
granian-2.8.4-cp313-cp313-macosx_10_12_x86_64.whl CPython 3.13 CPython 3.13 macOS 10.12+ x86-64 Details
granian-2.8.4-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details
granian-2.8.4-cp312-cp312-musllinux_1_1_x86_64.whl CPython 3.12 CPython 3.12 Linux musl 1.1+ x86-64 Details
granian-2.8.4-cp312-cp312-musllinux_1_1_armv7l.whl CPython 3.12 CPython 3.12 Linux musl 1.1+ ARMv7l Details
granian-2.8.4-cp312-cp312-musllinux_1_1_aarch64.whl CPython 3.12 CPython 3.12 Linux musl 1.1+ ARM64 Details
granian-2.8.4-cp312-cp312-manylinux_2_28_aarch64.whl CPython 3.12 CPython 3.12 Linux glibc 2.28+ ARM64 Details
granian-2.8.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.17+ x86-64 Details
granian-2.8.4-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl CPython 3.12 CPython 3.12 Linux glibc 2.17+ x86-32 Details
granian-2.8.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl CPython 3.12 CPython 3.12 Linux glibc 2.17+ ARMv7l Details
granian-2.8.4-cp312-cp312-macosx_11_0_arm64.whl CPython 3.12 CPython 3.12 macOS 11.0+ ARM64 Details
granian-2.8.4-cp312-cp312-macosx_10_12_x86_64.whl CPython 3.12 CPython 3.12 macOS 10.12+ x86-64 Details
granian-2.8.4-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details
granian-2.8.4-cp311-cp311-musllinux_1_1_x86_64.whl CPython 3.11 CPython 3.11 Linux musl 1.1+ x86-64 Details
granian-2.8.4-cp311-cp311-musllinux_1_1_armv7l.whl CPython 3.11 CPython 3.11 Linux musl 1.1+ ARMv7l Details
granian-2.8.4-cp311-cp311-musllinux_1_1_aarch64.whl CPython 3.11 CPython 3.11 Linux musl 1.1+ ARM64 Details
granian-2.8.4-cp311-cp311-manylinux_2_28_aarch64.whl CPython 3.11 CPython 3.11 Linux glibc 2.28+ ARM64 Details
granian-2.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.17+ x86-64 Details
granian-2.8.4-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl CPython 3.11 CPython 3.11 Linux glibc 2.17+ x86-32 Details
granian-2.8.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl CPython 3.11 CPython 3.11 Linux glibc 2.17+ ARMv7l Details
granian-2.8.4-cp311-cp311-macosx_11_0_arm64.whl CPython 3.11 CPython 3.11 macOS 11.0+ ARM64 Details
granian-2.8.4-cp311-cp311-macosx_10_12_x86_64.whl CPython 3.11 CPython 3.11 macOS 10.12+ x86-64 Details
granian-2.8.4-cp310-cp310-win_amd64.whl CPython 3.10 CPython 3.10 Windows x86-64 Details
granian-2.8.4-cp310-cp310-musllinux_1_1_x86_64.whl CPython 3.10 CPython 3.10 Linux musl 1.1+ x86-64 Details
granian-2.8.4-cp310-cp310-musllinux_1_1_armv7l.whl CPython 3.10 CPython 3.10 Linux musl 1.1+ ARMv7l Details
granian-2.8.4-cp310-cp310-musllinux_1_1_aarch64.whl CPython 3.10 CPython 3.10 Linux musl 1.1+ ARM64 Details
granian-2.8.4-cp310-cp310-manylinux_2_28_aarch64.whl CPython 3.10 CPython 3.10 Linux glibc 2.28+ ARM64 Details
granian-2.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.10 CPython 3.10 Linux glibc 2.17+ x86-64 Details
granian-2.8.4-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl CPython 3.10 CPython 3.10 Linux glibc 2.17+ x86-32 Details
granian-2.8.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl CPython 3.10 CPython 3.10 Linux glibc 2.17+ ARMv7l Details
granian-2.8.4-cp310-cp310-macosx_11_0_arm64.whl CPython 3.10 CPython 3.10 macOS 11.0+ ARM64 Details
granian-2.8.4-cp310-cp310-macosx_10_12_x86_64.whl CPython 3.10 CPython 3.10 macOS 10.12+ x86-64 Details

Total release size: 414.3 MB

Release files / granian-2.8.4.tar.gz

Download URL granian-2.8.4.tar.gz
Size 130.5 kB
Tags Source
SHA-256 checksum
How to use checksums
15e4f240dda62ca1bc9d84b264a25503812481ac60dfbedd784a3a25de110436
BLAKE2b-256 checksum
How to use checksums
466e7002545a24aa0652c2ea00e626563379316b713ef1a09c2db5eacc109a41
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-pp311-pypy311_pp73-win_amd64.whl

Download URL granian-2.8.4-pp311-pypy311_pp73-win_amd64.whl
Size 3.2 MB
Tags PyPy 3.11 PyPy 3.11 7.3 Windows x86-64
SHA-256 checksum
How to use checksums
7146d2083b7fdb24dda922fc77efb9cab57c5f74a52224b37ad32ebc757a50ec
BLAKE2b-256 checksum
How to use checksums
1528fc2b466122444d4408276f084d10e5f4179207134c7bc019e0b270dee440
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl

Download URL granian-2.8.4-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl
Size 5.2 MB
Tags Linux musl 1.1+ x86-64 PyPy 3.11 PyPy 3.11 7.3
SHA-256 checksum
How to use checksums
5be0afda13782037eb113839490a5b8961328a881446181630240a534f5065f4
BLAKE2b-256 checksum
How to use checksums
42e7d20a00ce6d1715ea1f57178858c66060288c4b66f0edd8d70743d3bfbee7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl

Download URL granian-2.8.4-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl
Size 5.1 MB
Tags Linux musl 1.1+ ARMv7l PyPy 3.11 PyPy 3.11 7.3
SHA-256 checksum
How to use checksums
1032f054bc0492fd918cccc0e833ded93a7374e5c244ca1dd3cdf9e2bc98ec6a
BLAKE2b-256 checksum
How to use checksums
cf5a33e3a1ef9b7f6397c3af588b50fc2ab459757ee0544be3830935fa940f6a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl

Download URL granian-2.8.4-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl
Size 5.3 MB
Tags Linux musl 1.1+ ARM64 PyPy 3.11 PyPy 3.11 7.3
SHA-256 checksum
How to use checksums
04aa545338eb0b305886ad4c4d537a897dbd56c750985f5a5e7b3c35115ce59a
BLAKE2b-256 checksum
How to use checksums
68ca9f8fd7cafcc589a3958713dc443fb43fd98512682e5aebb9a75275e584e7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl

Download URL granian-2.8.4-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl
Size 5.2 MB
Tags Linux glibc 2.28+ ARM64 PyPy 3.11 PyPy 3.11 7.3
SHA-256 checksum
How to use checksums
e8045cc056efee78a16de5f5be39ecc488b14e8921144b6f55d488e204320a99
BLAKE2b-256 checksum
How to use checksums
c59be17a879a7be4dee783f089c48855970fa5fddb4d5babab62984730d1552c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL granian-2.8.4-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 5.1 MB
Tags Linux glibc 2.17+ x86-64 PyPy 3.11 PyPy 3.11 7.3
SHA-256 checksum
How to use checksums
b04f6d426413adc0959c6335fa44cb6a522f9a187f0946645f04254fda970288
BLAKE2b-256 checksum
How to use checksums
27a2762a8edfdc2afd17033c27381ab315dceece97ade58eea59d923175f5f22
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl

Download URL granian-2.8.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl
Size 4.4 MB
Tags PyPy 3.11 PyPy 3.11 7.3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
5014d537497f6539d2875579990569898ca1b63f85259d06d183d94bb834f755
BLAKE2b-256 checksum
How to use checksums
c484dd5beb5463e1fa86bf7ce53a11fbd87b80bfcecd763ec867cecdb1be2776
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-pp311-pypy311_pp73-macosx_10_12_x86_64.whl

Download URL granian-2.8.4-pp311-pypy311_pp73-macosx_10_12_x86_64.whl
Size 4.6 MB
Tags PyPy 3.11 PyPy 3.11 7.3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
28f4963b7ff0d711a63747fc082e7311dd90bd9a07391386d6cff18b41b68dc6
BLAKE2b-256 checksum
How to use checksums
6131a05694133b27210f703d0da58036f0a0c03cc1cc3380ff3149c8ee43c6c4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp315-cp315t-win_amd64.whl

Download URL granian-2.8.4-cp315-cp315t-win_amd64.whl
Size 3.1 MB
Tags CPython 3.15 CPython 3.15 free-threading Windows x86-64
SHA-256 checksum
How to use checksums
44d3a5fdd97b78cd9971244996486387b2a80f577b42703725e78681f36ea810
BLAKE2b-256 checksum
How to use checksums
aea4b3f7b8010d71dc233bcb1a6bd9742153cf094da3b9d2f93a59a85690e6dc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp315-cp315t-musllinux_1_1_x86_64.whl

Download URL granian-2.8.4-cp315-cp315t-musllinux_1_1_x86_64.whl
Size 5.1 MB
Tags CPython 3.15 CPython 3.15 free-threading Linux musl 1.1+ x86-64
SHA-256 checksum
How to use checksums
2628902003bdb7830dae67dba301aa3457922beb06a66d090755f79c46801628
BLAKE2b-256 checksum
How to use checksums
244661c05c9ccb0548682580e1e47fe84b8338be8041f7d7c988b7b4eadb6c48
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp315-cp315t-musllinux_1_1_armv7l.whl

Download URL granian-2.8.4-cp315-cp315t-musllinux_1_1_armv7l.whl
Size 5.2 MB
Tags CPython 3.15 CPython 3.15 free-threading Linux musl 1.1+ ARMv7l
SHA-256 checksum
How to use checksums
1a3140ae4381bcae90cf61fbaadd34862d5757f4d50491f21f95907ccdd8f0a8
BLAKE2b-256 checksum
How to use checksums
4b0ef4bb890dd82ddc7a0137eb6a65634f7a2bc43e38b1f9894776fe0cbad2d3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp315-cp315t-musllinux_1_1_aarch64.whl

Download URL granian-2.8.4-cp315-cp315t-musllinux_1_1_aarch64.whl
Size 5.1 MB
Tags CPython 3.15 CPython 3.15 free-threading Linux musl 1.1+ ARM64
SHA-256 checksum
How to use checksums
74ef5fd4547f72c949daa2bfa5e1595f84e5c5e486d64ba821e1cbd9254dbc64
BLAKE2b-256 checksum
How to use checksums
ca8ccaa449473cd4a3c7d13957dd6af0da478f0fce4abe3b0f808edd2262783b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp315-cp315t-manylinux_2_28_aarch64.whl

Download URL granian-2.8.4-cp315-cp315t-manylinux_2_28_aarch64.whl
Size 4.9 MB
Tags CPython 3.15 CPython 3.15 free-threading Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
f49deab00a5bb19a262f7ed727181c9b24a47c1db58debc6e929559c9480dbff
BLAKE2b-256 checksum
How to use checksums
4482adba7f7748dbd66c2c56f26ccfcaf6fffb715ccda626da7741a1d2cff1d1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL granian-2.8.4-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 4.9 MB
Tags CPython 3.15 CPython 3.15 free-threading Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
96b36fa67273e846a98634abf00adbddae7a56480c1639920157b21a1e96fc5d
BLAKE2b-256 checksum
How to use checksums
46a420a42d79ca47af0376e766f5edd420bc967d41ce34a0dcf58eb028806dee
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp315-cp315t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl

Download URL granian-2.8.4-cp315-cp315t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Size 5.0 MB
Tags CPython 3.15 CPython 3.15 free-threading Linux glibc 2.17+ ARMv7l
SHA-256 checksum
How to use checksums
408f231dd02f2b0b0f9cbd1979952a242f28ea0abb7f4ba28dac93a607ce82da
BLAKE2b-256 checksum
How to use checksums
44c136e55a2e62faf9043004082240d1ba5dc7d2b86aaa324e0af70a85ae68a0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp315-cp315t-manylinux_2_12_i686.manylinux2010_i686.whl

Download URL granian-2.8.4-cp315-cp315t-manylinux_2_12_i686.manylinux2010_i686.whl
Size 4.4 MB
Tags CPython 3.15 CPython 3.15 free-threading Linux glibc 2.12+ x86-32
SHA-256 checksum
How to use checksums
4a751aa614a7c970c49abdd09e2c8434e23b6c4b9f574db811d7e34a1bfb63a2
BLAKE2b-256 checksum
How to use checksums
e10f0512b4ccbd3622d58ac15214b19e9991f863322bc3d99eed83c63c3ef1f1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp315-cp315t-macosx_11_0_arm64.whl

Download URL granian-2.8.4-cp315-cp315t-macosx_11_0_arm64.whl
Size 4.2 MB
Tags CPython 3.15 CPython 3.15 free-threading macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
4eaa524434e86ff49a5ec91cc9f68379c8c1fbb95640b4178173f74dda9daf51
BLAKE2b-256 checksum
How to use checksums
59863b8e351e427bcf77bfcb91f84bc76e487fd6d1808106874f071a97b4c3a7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp315-cp315t-macosx_10_12_x86_64.whl

Download URL granian-2.8.4-cp315-cp315t-macosx_10_12_x86_64.whl
Size 4.4 MB
Tags CPython 3.15 CPython 3.15 free-threading macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
05e0b6fd7f6ac6f584d36886407399a327d292b1950f6dc96b0f9f865d5ddd99
BLAKE2b-256 checksum
How to use checksums
9d39e07a28bc53346d93a518bd89eb21c1839af1ab05d930502bf0177f0c064a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp315-cp315-win_amd64.whl

Download URL granian-2.8.4-cp315-cp315-win_amd64.whl
Size 3.1 MB
Tags CPython 3.15 Windows x86-64
SHA-256 checksum
How to use checksums
a23f30b2acf5bc1b30fc72110142e098cf929d75321c47db2f6c16a309ef9fe2
BLAKE2b-256 checksum
How to use checksums
fbf97ed2d4489b24a76d59529efd28c814e3ec2100af830809ac46cac564a07e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp315-cp315-musllinux_1_1_x86_64.whl

Download URL granian-2.8.4-cp315-cp315-musllinux_1_1_x86_64.whl
Size 5.1 MB
Tags CPython 3.15 Linux musl 1.1+ x86-64
SHA-256 checksum
How to use checksums
38519ba3650c5667af5aec2d6dcc778656696742a777661a3c27caa0b68ac05f
BLAKE2b-256 checksum
How to use checksums
ae11f61ed83a4d888e7b3d5171ede6daeadf045ae273bf0d58cb3c7eedce24c1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp315-cp315-musllinux_1_1_armv7l.whl

Download URL granian-2.8.4-cp315-cp315-musllinux_1_1_armv7l.whl
Size 5.1 MB
Tags CPython 3.15 Linux musl 1.1+ ARMv7l
SHA-256 checksum
How to use checksums
b1aa1a2f42e41cc63fbd2b3cb7de0fe65b23e656615779c6ec96ccf2112e5325
BLAKE2b-256 checksum
How to use checksums
edc5e41b74a152882c1af274df3ed2d24d626538d5ea99763670367e5f9ad3ba
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp315-cp315-musllinux_1_1_aarch64.whl

Download URL granian-2.8.4-cp315-cp315-musllinux_1_1_aarch64.whl
Size 5.2 MB
Tags CPython 3.15 Linux musl 1.1+ ARM64
SHA-256 checksum
How to use checksums
bc21d4aec5c36b251855ef63ef7173a3cd7105fc20936c4e7ea0c03a9638d246
BLAKE2b-256 checksum
How to use checksums
fa8a52701781c0761683fafdc0675244b769c7e952ebe907c1c30a6b32d6a17d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp315-cp315-manylinux_2_28_aarch64.whl

Download URL granian-2.8.4-cp315-cp315-manylinux_2_28_aarch64.whl
Size 5.1 MB
Tags CPython 3.15 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
3c3385e268c4c4e79af73f1b2d8dc4eec9701a3105fffbb148f786351580fc82
BLAKE2b-256 checksum
How to use checksums
14a37724eb6ce6bb0fc6eceff22b9ca9ab3a8669543beef5a1061fc75593f89b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL granian-2.8.4-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 5.0 MB
Tags CPython 3.15 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
79cc8b1d9f6f3027800b6c14398978d832fee78a2050ca83c60a6c0cdcd95195
BLAKE2b-256 checksum
How to use checksums
6f6c95b2d44f773cc54c40c73c556228a28234d3b28a24ebd1d8a9f106724a3b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp315-cp315-manylinux_2_17_i686.manylinux2014_i686.whl

Download URL granian-2.8.4-cp315-cp315-manylinux_2_17_i686.manylinux2014_i686.whl
Size 4.6 MB
Tags CPython 3.15 Linux glibc 2.17+ x86-32
SHA-256 checksum
How to use checksums
3c2f85e97c4c1578c05fafe4c82878a9d868049ae7e919ebd28d3b5ea30f0dd3
BLAKE2b-256 checksum
How to use checksums
a4b6d4fe258bc4c82eaec3902545dc4a7fb90f9810504dbba1260b022b8ef8e9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl

Download URL granian-2.8.4-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Size 5.0 MB
Tags CPython 3.15 Linux glibc 2.17+ ARMv7l
SHA-256 checksum
How to use checksums
6bf588c3c8d26bd355f75442a55806a2c62a0d81005ed83c7c382062da8127ae
BLAKE2b-256 checksum
How to use checksums
7b5f1ea52bf78cf5234f3fb4d6c13349f9c475122c6fc1b3278549622a2f1da3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp315-cp315-macosx_11_0_arm64.whl

Download URL granian-2.8.4-cp315-cp315-macosx_11_0_arm64.whl
Size 4.3 MB
Tags CPython 3.15 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
61692e10cba625ea8455039629b87c8df2b1c25daca6c6891384d2315b7a61a2
BLAKE2b-256 checksum
How to use checksums
4195099a730f340556291d13aafa2fabd425ed951edd9e7d25c15c5affbb4420
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp315-cp315-macosx_10_12_x86_64.whl

Download URL granian-2.8.4-cp315-cp315-macosx_10_12_x86_64.whl
Size 4.5 MB
Tags CPython 3.15 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
5cb49d576297e15657282bb8755945e990729e0e3a830a2bc1e959e7680f4528
BLAKE2b-256 checksum
How to use checksums
4aa683006f1d834631d7baecdea42d504c4d2ab9a25cc2e21044c106983c7527
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp314-cp314t-win_amd64.whl

Download URL granian-2.8.4-cp314-cp314t-win_amd64.whl
Size 3.1 MB
Tags CPython 3.14 CPython 3.14 free-threading Windows x86-64
SHA-256 checksum
How to use checksums
66bf5670d5b29e4b026516e29a3ce74cbb83a76b4b448398a4fc503c5497c772
BLAKE2b-256 checksum
How to use checksums
aae12290930bb9f322e2bc6c3f6f576600ff16778fc8d19fcac6bce90d298bc0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp314-cp314t-musllinux_1_1_x86_64.whl

Download URL granian-2.8.4-cp314-cp314t-musllinux_1_1_x86_64.whl
Size 5.1 MB
Tags CPython 3.14 CPython 3.14 free-threading Linux musl 1.1+ x86-64
SHA-256 checksum
How to use checksums
663bdf86c3afbb16c2f4b390de78dbd4ce8ad5ba41264ae4ac52a79b58bcddd7
BLAKE2b-256 checksum
How to use checksums
1cab922185fd354eb531fc78cf2205f3523e25452efc2faf4e0ba47f4649a5de
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp314-cp314t-musllinux_1_1_armv7l.whl

Download URL granian-2.8.4-cp314-cp314t-musllinux_1_1_armv7l.whl
Size 5.2 MB
Tags CPython 3.14 CPython 3.14 free-threading Linux musl 1.1+ ARMv7l
SHA-256 checksum
How to use checksums
6d9c15ad2e6f692ef7c8e7d0a82f6a9942268b8859ed790e4aaaa5dc18aa1a60
BLAKE2b-256 checksum
How to use checksums
a20be11a340ebbb717eb3e9b30c1baa9684fcb0d065f9109412f1e7a8067849d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp314-cp314t-musllinux_1_1_aarch64.whl

Download URL granian-2.8.4-cp314-cp314t-musllinux_1_1_aarch64.whl
Size 5.1 MB
Tags CPython 3.14 CPython 3.14 free-threading Linux musl 1.1+ ARM64
SHA-256 checksum
How to use checksums
9cab808b3ef5d8db83226e898510b337d6872bceaa8e1e5f932ba0df90fdf974
BLAKE2b-256 checksum
How to use checksums
4fa571735f279a6598c7e09cbb020dda67a4303bb74ece2c834e51345a12d678
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp314-cp314t-manylinux_2_28_aarch64.whl

Download URL granian-2.8.4-cp314-cp314t-manylinux_2_28_aarch64.whl
Size 4.9 MB
Tags CPython 3.14 CPython 3.14 free-threading Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
8696d0a85251c6be57d5f768af38d0b065c2704c61f7872b692ad9d604b202e5
BLAKE2b-256 checksum
How to use checksums
6e3f5a953871497f0d3d6b9dd23dee5bf96421a97ecbec34d1732ca68512805d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL granian-2.8.4-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 4.9 MB
Tags CPython 3.14 CPython 3.14 free-threading Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
605ec23545d5c49c8a42ba0f94f0bccc4c05777cedc7ebcdd008313de0fb34c3
BLAKE2b-256 checksum
How to use checksums
534d7e9f7168bce74d4629b596ca9832388fa1831aef0ed51ac5f01752092c54
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl

Download URL granian-2.8.4-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Size 5.0 MB
Tags CPython 3.14 CPython 3.14 free-threading Linux glibc 2.17+ ARMv7l
SHA-256 checksum
How to use checksums
e6273949df06399caf9dbab4d4580f0c90ac47bdb2c2befc582883b16352d908
BLAKE2b-256 checksum
How to use checksums
024bd1790037d362936370ca6aecb366429a23ab4829c4ac9d416077e9972781
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp314-cp314t-manylinux_2_12_i686.manylinux2010_i686.whl

Download URL granian-2.8.4-cp314-cp314t-manylinux_2_12_i686.manylinux2010_i686.whl
Size 4.4 MB
Tags CPython 3.14 CPython 3.14 free-threading Linux glibc 2.12+ x86-32
SHA-256 checksum
How to use checksums
0d14375c88b689fa236bc68f80a8157142207971e4c87d500fd20740e69ba16d
BLAKE2b-256 checksum
How to use checksums
22a65d4b8e092a105d77f523008ea727d8d29f7aa5ba08c690baa15f12e59ac8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp314-cp314t-macosx_11_0_arm64.whl

Download URL granian-2.8.4-cp314-cp314t-macosx_11_0_arm64.whl
Size 4.2 MB
Tags CPython 3.14 CPython 3.14 free-threading macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
20db1d287d1eba2e25ed71ed64ef5385bba09866d686b540f190c7d3c16f422f
BLAKE2b-256 checksum
How to use checksums
d15af7df2a966d1be6b6d741806e70a634f3a134e4718479a2f489d61467fcde
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp314-cp314t-macosx_10_12_x86_64.whl

Download URL granian-2.8.4-cp314-cp314t-macosx_10_12_x86_64.whl
Size 4.4 MB
Tags CPython 3.14 CPython 3.14 free-threading macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
169339c7f6f8c755fb27e8639ba4c5e86e1c70a371d6067ae8448b6f74e52ba2
BLAKE2b-256 checksum
How to use checksums
dbba7d522854e9994a53e50b652e30f26833d742395d12d23ffdb0c10389afd3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp314-cp314-win_amd64.whl

Download URL granian-2.8.4-cp314-cp314-win_amd64.whl
Size 3.1 MB
Tags CPython 3.14 Windows x86-64
SHA-256 checksum
How to use checksums
e0479221d6d0224f26130decd24f01a4415c672c18f35c8b4500cd42ec5591c0
BLAKE2b-256 checksum
How to use checksums
e6895825188a9acfad14a780bf90435ebb8a603c66b459d9eff44fdee596b060
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp314-cp314-musllinux_1_1_x86_64.whl

Download URL granian-2.8.4-cp314-cp314-musllinux_1_1_x86_64.whl
Size 5.1 MB
Tags CPython 3.14 Linux musl 1.1+ x86-64
SHA-256 checksum
How to use checksums
85b87b6fb351d1bb1926691c6c73ec95f21eb6882f4742241b597391c456a645
BLAKE2b-256 checksum
How to use checksums
0f6cf8fda6d6551576f635d403c4bb7945fe9400141fb30236556a8b1ab4ea04
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp314-cp314-musllinux_1_1_armv7l.whl

Download URL granian-2.8.4-cp314-cp314-musllinux_1_1_armv7l.whl
Size 5.1 MB
Tags CPython 3.14 Linux musl 1.1+ ARMv7l
SHA-256 checksum
How to use checksums
71242dee81f4f59e8d6dff173682332cadd9635e76a5b014e7b664421db90566
BLAKE2b-256 checksum
How to use checksums
37e6f15ee7af0a18fa7881ca692300d100296eeea98358d523b2d321cbe6f3b4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp314-cp314-musllinux_1_1_aarch64.whl

Download URL granian-2.8.4-cp314-cp314-musllinux_1_1_aarch64.whl
Size 5.2 MB
Tags CPython 3.14 Linux musl 1.1+ ARM64
SHA-256 checksum
How to use checksums
bd7796798d4e127b273dde3d5b7fd3b43f682e6b21f2cef84c8b20e6a09e1255
BLAKE2b-256 checksum
How to use checksums
2d5dbf0619b52f671b6a535c56295f48a87d11e6f7f27108433ba176c39322d3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp314-cp314-manylinux_2_28_aarch64.whl

Download URL granian-2.8.4-cp314-cp314-manylinux_2_28_aarch64.whl
Size 5.1 MB
Tags CPython 3.14 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
72e09942428b04931a0b1fb853f5101352a11f82e5805468d72bd2f5ec27e810
BLAKE2b-256 checksum
How to use checksums
3c77f82439fecd929514915582039a3de7d27aff95c1bff517324aea77273f30
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL granian-2.8.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 5.0 MB
Tags CPython 3.14 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
41fd375030f9de7c864d52e51bc436db5476a5599fa97a6cd481fbf7c1e349ca
BLAKE2b-256 checksum
How to use checksums
4e447cee563075a450361faa1441af71e9ad2e847398f88dbab67324dcf5a368
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl

Download URL granian-2.8.4-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl
Size 4.6 MB
Tags CPython 3.14 Linux glibc 2.17+ x86-32
SHA-256 checksum
How to use checksums
7f00690ea448a4dcd4cc69e8bcdcf8cb6e7acf9549c273ef344577bc5f5d05cb
BLAKE2b-256 checksum
How to use checksums
a609cf2b9f5e43723260e7abca049ab637c3d6c7c417fadffa2fbe1ddbaef192
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl

Download URL granian-2.8.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Size 5.0 MB
Tags CPython 3.14 Linux glibc 2.17+ ARMv7l
SHA-256 checksum
How to use checksums
439f2bc74e0db5485a1749ec7040043a4061e05d444e4a754393d90738697668
BLAKE2b-256 checksum
How to use checksums
695a3840c16e0ba01724f2aa00acd784d69f5979143651a22bea709e513ed201
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp314-cp314-macosx_11_0_arm64.whl

Download URL granian-2.8.4-cp314-cp314-macosx_11_0_arm64.whl
Size 4.3 MB
Tags CPython 3.14 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
522de7ed1154082f11176a45df841bf58ed45fcaf810eef6200e39b4f371a29c
BLAKE2b-256 checksum
How to use checksums
688a89d37db67ff2682a3ffaec1b7ea09af7db59624713d30f5e7b7fb3a633d7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp314-cp314-macosx_10_12_x86_64.whl

Download URL granian-2.8.4-cp314-cp314-macosx_10_12_x86_64.whl
Size 4.5 MB
Tags CPython 3.14 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
e6387e6c784ba6c778b6417161bfed6fd75dc93df7152fedc61847ca79bdf3c4
BLAKE2b-256 checksum
How to use checksums
dfc391d8bb7c8250ed85ef187271495e16447afa7d282dfd8cb26d8bd620de63
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp313-cp313-win_amd64.whl

Download URL granian-2.8.4-cp313-cp313-win_amd64.whl
Size 3.2 MB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
e1aca643411ee94cb7acf5c2378d46c9e32d6cd94d235ae940fbbcef972cd60b
BLAKE2b-256 checksum
How to use checksums
be729ff987c1651dfe446ed514312b1f8c8d7a83eb7e26d082b7d6184e37213a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp313-cp313-musllinux_1_1_x86_64.whl

Download URL granian-2.8.4-cp313-cp313-musllinux_1_1_x86_64.whl
Size 5.1 MB
Tags CPython 3.13 Linux musl 1.1+ x86-64
SHA-256 checksum
How to use checksums
8bc056a839cfc1a498c8505ee9fafe86e6da4caa01bc2358efbb59fb6607d663
BLAKE2b-256 checksum
How to use checksums
16c02aeab45b53968edb7ef80466da684c34f1afd36c6a692ceb3e90f5c41e6f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp313-cp313-musllinux_1_1_armv7l.whl

Download URL granian-2.8.4-cp313-cp313-musllinux_1_1_armv7l.whl
Size 5.1 MB
Tags CPython 3.13 Linux musl 1.1+ ARMv7l
SHA-256 checksum
How to use checksums
e0fe0f742a807abb25f4145303e46ff2dfd6fcd4b3c541fa89f691a0b1fd84c0
BLAKE2b-256 checksum
How to use checksums
530e96cb2d5d2682f0c00fa7919b9771ebd09d38837be35b28b885d7e7365f46
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp313-cp313-musllinux_1_1_aarch64.whl

Download URL granian-2.8.4-cp313-cp313-musllinux_1_1_aarch64.whl
Size 5.2 MB
Tags CPython 3.13 Linux musl 1.1+ ARM64
SHA-256 checksum
How to use checksums
82285a809e72d59a576904fed60bb7aa117e52a1f20ac62bb1149b585cba6dea
BLAKE2b-256 checksum
How to use checksums
59b6a00f0b11fcf1894914c3c0067a577beed4fb3983683fa919b1c0981bd668
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp313-cp313-manylinux_2_28_aarch64.whl

Download URL granian-2.8.4-cp313-cp313-manylinux_2_28_aarch64.whl
Size 5.1 MB
Tags CPython 3.13 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
c5a028410a4f9532ec5c93769828cc978b17efe7e3fae76fc66311df81aeb8d0
BLAKE2b-256 checksum
How to use checksums
cdc2ea37cb80127293a24ea8dd5c9223b446ec132de819d8abcf58a05fbc32c8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL granian-2.8.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 5.0 MB
Tags CPython 3.13 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
f28d6ff79f26e7cd4c992b6198a9f14fae266da80d2b6bd0da8fceef07c57850
BLAKE2b-256 checksum
How to use checksums
135ac64b1c67127deaed269ed73efce0f76171a0701893a0c724c300c86e4fbe
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl

Download URL granian-2.8.4-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl
Size 4.6 MB
Tags CPython 3.13 Linux glibc 2.17+ x86-32
SHA-256 checksum
How to use checksums
39c19059bdc7e9156c14efe2c540af16049dfb3a8d197ba0742b973f34ae48e6
BLAKE2b-256 checksum
How to use checksums
2cf176de3df725f6fa815f3e3f051cfdcca2a921e3b1832104c04d1bf6422535
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl

Download URL granian-2.8.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Size 5.0 MB
Tags CPython 3.13 Linux glibc 2.17+ ARMv7l
SHA-256 checksum
How to use checksums
bf0c4a2cabce0df8a605a49d98b0022cd067d3b813ac45b3a88f512c3db59fe1
BLAKE2b-256 checksum
How to use checksums
1220555b072727e7a6ee13a08ad5c3cc752195ce5042ed820767ee5aa389f752
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp313-cp313-macosx_11_0_arm64.whl

Download URL granian-2.8.4-cp313-cp313-macosx_11_0_arm64.whl
Size 4.3 MB
Tags CPython 3.13 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
8359c7bbc316cc6d9272e44cc82e62a14bd6affe47b0c10c95c30cf3d0f02d91
BLAKE2b-256 checksum
How to use checksums
afa5282169d9e30f99dab2bf9d9b2d559fd425deaa1b8b15ab64e9029b6dabd1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp313-cp313-macosx_10_12_x86_64.whl

Download URL granian-2.8.4-cp313-cp313-macosx_10_12_x86_64.whl
Size 4.5 MB
Tags CPython 3.13 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
1cb89448969d5b64b131a7d2709cfcd207c85d5535a4b9c11648f78184b1fa54
BLAKE2b-256 checksum
How to use checksums
a6ab0fc042bf594304f7587ac288bf29d9026b434b503e643c52f54c963c5732
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp312-cp312-win_amd64.whl

Download URL granian-2.8.4-cp312-cp312-win_amd64.whl
Size 3.2 MB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
ecdf904691c07e5e73f79a27b12926aac86d04f264fd8a72fedf2e0bdc53c5c4
BLAKE2b-256 checksum
How to use checksums
1928886c3ca853cc905d20c6ca39c686953c169a5b9a8ccaf32bdf65b8c4292a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp312-cp312-musllinux_1_1_x86_64.whl

Download URL granian-2.8.4-cp312-cp312-musllinux_1_1_x86_64.whl
Size 5.1 MB
Tags CPython 3.12 Linux musl 1.1+ x86-64
SHA-256 checksum
How to use checksums
d3a7d8b71692f3dd22595fc4f4cda45a6d82e773df4da39a5f9ecf17fc8c543b
BLAKE2b-256 checksum
How to use checksums
b8117a1658cbeb6fc2ca10c1f8931865322d53ea72773d00fd769b0a888c8787
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp312-cp312-musllinux_1_1_armv7l.whl

Download URL granian-2.8.4-cp312-cp312-musllinux_1_1_armv7l.whl
Size 5.3 MB
Tags CPython 3.12 Linux musl 1.1+ ARMv7l
SHA-256 checksum
How to use checksums
cc7ef4fc9036789a91cca6158e41062587817243ac96e2f05604c0ec145669a6
BLAKE2b-256 checksum
How to use checksums
e50f8f8ed0bb55f1c64b1de86c8a416cdd85775acf90ffdf4042e926280029ec
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp312-cp312-musllinux_1_1_aarch64.whl

Download URL granian-2.8.4-cp312-cp312-musllinux_1_1_aarch64.whl
Size 5.2 MB
Tags CPython 3.12 Linux musl 1.1+ ARM64
SHA-256 checksum
How to use checksums
05bf45f207d1be729ae383f09c07ee08d85aa6cd263e066ec88c44a8792b116e
BLAKE2b-256 checksum
How to use checksums
a9d774e1777a5c064bdcd1960014cd7d9ba928d384083123529e334d6f97380e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp312-cp312-manylinux_2_28_aarch64.whl

Download URL granian-2.8.4-cp312-cp312-manylinux_2_28_aarch64.whl
Size 5.1 MB
Tags CPython 3.12 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
19feff2d50f9c72d88d554e66e7cf465bf49635a99c874fa5b632df0e27e487d
BLAKE2b-256 checksum
How to use checksums
53e4a60f4e237e9f096d6d0976ad51718d695336acc785b1a0a98ae218153840
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL granian-2.8.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 5.0 MB
Tags CPython 3.12 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
18037cc4a5fbaebedcf333ae29ce2f742158e2a73195f6948d2f26cd9e689636
BLAKE2b-256 checksum
How to use checksums
767b3a7501dec4bb630db8832f53c1d65ad344783aebf579b3d5e99824c064ec
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl

Download URL granian-2.8.4-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl
Size 4.7 MB
Tags CPython 3.12 Linux glibc 2.17+ x86-32
SHA-256 checksum
How to use checksums
123daec45941e285b9f057a957183404f1607f239fcf7aeffef168384dfb3fa7
BLAKE2b-256 checksum
How to use checksums
bc5d65bb8ac6b6f2593902bb5844655753fe1cf1f06825a9880b5efe88f681c2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl

Download URL granian-2.8.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Size 5.1 MB
Tags CPython 3.12 Linux glibc 2.17+ ARMv7l
SHA-256 checksum
How to use checksums
96ff07be39e0d7d94a43736a87c1cc41c8a8d17ef9336334b04cc055911b5968
BLAKE2b-256 checksum
How to use checksums
94fdb18ca267dd93f067bfe2d2b0a484d662987c44303bd1b31324cb9713e4fb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp312-cp312-macosx_11_0_arm64.whl

Download URL granian-2.8.4-cp312-cp312-macosx_11_0_arm64.whl
Size 4.3 MB
Tags CPython 3.12 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
0519692106465e0145d1a810034227a3cae0008d2aee3a19fe250105307c265d
BLAKE2b-256 checksum
How to use checksums
505376be0f6ad8be7214cb156ff26f4d36eee6f2e6ee5ba492a33c8d721416f1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp312-cp312-macosx_10_12_x86_64.whl

Download URL granian-2.8.4-cp312-cp312-macosx_10_12_x86_64.whl
Size 4.5 MB
Tags CPython 3.12 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
2991b162535c9a0d8847b18c5111f8f0b9547520f0fcfb36b12332fdafe84660
BLAKE2b-256 checksum
How to use checksums
c0b7229ef688c4829522b65113754cd0ede0b3b3586596e1e8da4dd7e0932c90
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp311-cp311-win_amd64.whl

Download URL granian-2.8.4-cp311-cp311-win_amd64.whl
Size 3.2 MB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
5e730cec0b6fe88251bef7896590ca3899a69b05bf766395a572449d53ed09ed
BLAKE2b-256 checksum
How to use checksums
ce118c8bb3b30c0f786c2ccb4117633a62ed3a752aaaf55de719b6a924280351
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp311-cp311-musllinux_1_1_x86_64.whl

Download URL granian-2.8.4-cp311-cp311-musllinux_1_1_x86_64.whl
Size 5.1 MB
Tags CPython 3.11 Linux musl 1.1+ x86-64
SHA-256 checksum
How to use checksums
ca1d8e938ddc7c076b9d0cf861ed50cb846eab4c18f2e61550d16b34385a1fc4
BLAKE2b-256 checksum
How to use checksums
a5a649f91c22d3b27d3aff3d84604a7b8f18d4bfd8d813b3b6aefbda3bc9461d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp311-cp311-musllinux_1_1_armv7l.whl

Download URL granian-2.8.4-cp311-cp311-musllinux_1_1_armv7l.whl
Size 5.1 MB
Tags CPython 3.11 Linux musl 1.1+ ARMv7l
SHA-256 checksum
How to use checksums
d169b30ee2f45f434a7f80d40b13d9558e8e367e1ae4788aebb2774c02212650
BLAKE2b-256 checksum
How to use checksums
e315a7e5108a16abc06259b76ceb4dfe4f6f8fe03bc47d094249ef528152ddcf
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp311-cp311-musllinux_1_1_aarch64.whl

Download URL granian-2.8.4-cp311-cp311-musllinux_1_1_aarch64.whl
Size 5.2 MB
Tags CPython 3.11 Linux musl 1.1+ ARM64
SHA-256 checksum
How to use checksums
90fbcd39b37f4ff0de61910b7d1c5c0302b1289fa64ba380c923fbb30a780c50
BLAKE2b-256 checksum
How to use checksums
2ccafb6718452d70799cd2ed57a95f649ab0edac506875ea45101543ef934af8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp311-cp311-manylinux_2_28_aarch64.whl

Download URL granian-2.8.4-cp311-cp311-manylinux_2_28_aarch64.whl
Size 5.2 MB
Tags CPython 3.11 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
e3d6ab489b5923378444cd0dd0a18381b2c6344897d1efbbf3661f3565cfa072
BLAKE2b-256 checksum
How to use checksums
891c46e798550edb5e61f569632db50efb883aa0de8b6fb78e0dd090eff2f353
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL granian-2.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 5.0 MB
Tags CPython 3.11 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
9a9b83d983673de8646b4749e6f1880a72c3490e1fd7193f98567d1d82f32ed3
BLAKE2b-256 checksum
How to use checksums
24ee64acbfbd997e7ce5a582adfca67aed16023b290dcb7018fc20c36a813b5d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl

Download URL granian-2.8.4-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl
Size 4.6 MB
Tags CPython 3.11 Linux glibc 2.17+ x86-32
SHA-256 checksum
How to use checksums
ae3948d914c2b19be648b815d8d5fc7cb30c77e9ffcfad61a2d79b82f26f55c2
BLAKE2b-256 checksum
How to use checksums
65de7f999933fc250baa9627dfb9bf2eef3472c4aff0a8124c6fc70998a44fb0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl

Download URL granian-2.8.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Size 5.0 MB
Tags CPython 3.11 Linux glibc 2.17+ ARMv7l
SHA-256 checksum
How to use checksums
dbe00c88fbb2d0dae9b7287c04ebe2b5904da01e9fe7dcde38963082cc60946d
BLAKE2b-256 checksum
How to use checksums
4f2c05b016c07ff35ff1ac1dca6464154695dc01a8ae6591674253f627628fa8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp311-cp311-macosx_11_0_arm64.whl

Download URL granian-2.8.4-cp311-cp311-macosx_11_0_arm64.whl
Size 4.4 MB
Tags CPython 3.11 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
f612a6bea2440f3384f7d77f4d0317f7f9cfe45c290961a2f653e0467179dd62
BLAKE2b-256 checksum
How to use checksums
24c190d7e6c2a3d4243991c62a17d4b721152f0f9ec59c4c6d8f5cd18839e4e4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp311-cp311-macosx_10_12_x86_64.whl

Download URL granian-2.8.4-cp311-cp311-macosx_10_12_x86_64.whl
Size 4.6 MB
Tags CPython 3.11 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
c5a56d4bf495593f5ebad712fdeaa7303cd7abcd51f5a24b497db0e766ec97b3
BLAKE2b-256 checksum
How to use checksums
25cf69c41ae785ac5eac550713944aa8c70ce9b64055f3185d827f6ecc7511f8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp310-cp310-win_amd64.whl

Download URL granian-2.8.4-cp310-cp310-win_amd64.whl
Size 3.2 MB
Tags CPython 3.10 Windows x86-64
SHA-256 checksum
How to use checksums
becf63a3b106e9e9eacd1bc5279148e75ae7530964f9636ab302124fb93b9c4b
BLAKE2b-256 checksum
How to use checksums
0f25aea1d9d00eefdaf83ae40637da6de50d42ef1b01be92f553902ad30d4a0b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp310-cp310-musllinux_1_1_x86_64.whl

Download URL granian-2.8.4-cp310-cp310-musllinux_1_1_x86_64.whl
Size 5.1 MB
Tags CPython 3.10 Linux musl 1.1+ x86-64
SHA-256 checksum
How to use checksums
98c4e4055a56eab6320fe019b7f71680eb793b14d0110bf3475e5d3017bf0fba
BLAKE2b-256 checksum
How to use checksums
9d65bf3c552c4c01af85bfd6b7a1d0393cdb8fca61c40fedee3d7e9ebd1fd062
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp310-cp310-musllinux_1_1_armv7l.whl

Download URL granian-2.8.4-cp310-cp310-musllinux_1_1_armv7l.whl
Size 5.2 MB
Tags CPython 3.10 Linux musl 1.1+ ARMv7l
SHA-256 checksum
How to use checksums
22ed1c19ea209683525b6d3288e9c72254f84c9b669a61a2a0e9e15df25fa5af
BLAKE2b-256 checksum
How to use checksums
a2034caa4422327a14bfb2fa24adfb36acf11c9bc1222c1559d1a9a7c1c855db
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp310-cp310-musllinux_1_1_aarch64.whl

Download URL granian-2.8.4-cp310-cp310-musllinux_1_1_aarch64.whl
Size 5.2 MB
Tags CPython 3.10 Linux musl 1.1+ ARM64
SHA-256 checksum
How to use checksums
002ec119b521d1663c8427a04a2863900ec2e474ebaeae78a5d7cc55fb7df875
BLAKE2b-256 checksum
How to use checksums
a6baa01665815e0e8d4cc08bcfe6510bef858029862da005b3355622b7f9f3f5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp310-cp310-manylinux_2_28_aarch64.whl

Download URL granian-2.8.4-cp310-cp310-manylinux_2_28_aarch64.whl
Size 5.2 MB
Tags CPython 3.10 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
32ecb9b736fd9af1aba1a45c52db5571b788aecd1d91beaee2ed53223b9385fe
BLAKE2b-256 checksum
How to use checksums
0bc9aa9316a4e81701344c65f7296a14f4233ea67037767c7078018d7ac1434c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL granian-2.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 5.0 MB
Tags CPython 3.10 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
d6eb12743839106795402d9cf0b4b707d095caf245dd7f17057f524f784433ea
BLAKE2b-256 checksum
How to use checksums
88d8443938d18b009abc726d194a09157348ebb3e0a76b9ccba5c652a14fe841
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl

Download URL granian-2.8.4-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl
Size 4.6 MB
Tags CPython 3.10 Linux glibc 2.17+ x86-32
SHA-256 checksum
How to use checksums
df3ead33072e275aaef6ecd9e6e86cd893f66718176f2f62b8a0ee7e3cda4e95
BLAKE2b-256 checksum
How to use checksums
d318a37146e0daa6e6128c42c9abb0d018ec1da9f539c55e706d7dac7b787e71
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl

Download URL granian-2.8.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Size 5.1 MB
Tags CPython 3.10 Linux glibc 2.17+ ARMv7l
SHA-256 checksum
How to use checksums
e878f9944bc049f57af82df58178e5983ff9de3e8bd89177f8c6df8ecf4941fe
BLAKE2b-256 checksum
How to use checksums
bc6021f1458bfbdbd8f85156d47e28001d1975f782a76ae613850d70f15183c9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp310-cp310-macosx_11_0_arm64.whl

Download URL granian-2.8.4-cp310-cp310-macosx_11_0_arm64.whl
Size 4.3 MB
Tags CPython 3.10 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
9394a310ae6edb4cc22f7e764f36e40f7c97777a96b76729b6875acbf1838ae3
BLAKE2b-256 checksum
How to use checksums
ec528c7115a319e6ef6aef179ff8b08233526ad792f7f51ccb1c5a3957982493
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / granian-2.8.4-cp310-cp310-macosx_10_12_x86_64.whl

Download URL granian-2.8.4-cp310-cp310-macosx_10_12_x86_64.whl
Size 4.6 MB
Tags CPython 3.10 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
06b996f89522104425250d6462f087e916cf4be39dbf2b603df9d9dda7e37a2f
BLAKE2b-256 checksum
How to use checksums
0dea90475ee4554bdc6227084d3ad15539d4af01bbf0d43125ee62860621b50e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release history Release notifications | RSS feed

This release

2.8.4 This release

89 release files

2.8.3

89 release files

2.8.2

89 release files

2.7.8

79 release files

2.7.7

79 release files

2.7.6

79 release files

2.7.5

79 release files

2.7.4

79 release files

2.7.2

79 release files

2.6.0

79 release files

2.3.4

83 release files

2.3.1

80 release files

2.3.0

80 release files

2.2.5

80 release files

2.2.4

80 release files

2.2.0

61 release files

2.1.2

61 release files

2.1.1

61 release files

2.1.0

61 release files

1.7.6

48 release files

1.6.4

64 release files

1.5.2

64 release files

1.4.4

57 release files

1.3.2

57 release files

1.2.3

57 release files

1.0.2

57 release files

0.7.6

57 release files

0.6.1

48 release files

0.5.3

40 release files

0.4.3

40 release files

0.2.6

50 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page