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.

Release files for granian 2.8.3

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.3
File Size Uploaded
granian-2.8.3.tar.gz 130.3 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for granian 2.8.3
File
granian-2.8.3-pp311-pypy311_pp73-win_amd64.whl PyPy 3.11 PyPy 3.11 7.3 Windows x86-64 Details
granian-2.8.3-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.3-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.3-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.3-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.3-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.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl PyPy 3.11 PyPy 3.11 7.3 macOS 11.0+ ARM64 Details
granian-2.8.3-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.3-cp315-cp315t-win_amd64.whl CPython 3.15 CPython 3.15 free-threading Windows x86-64 Details
granian-2.8.3-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.3-cp315-cp315t-musllinux_1_1_armv7l.whl CPython 3.15 CPython 3.15 free-threading Linux musl 1.1+ ARMv7l Details
granian-2.8.3-cp315-cp315t-musllinux_1_1_aarch64.whl CPython 3.15 CPython 3.15 free-threading Linux musl 1.1+ ARM64 Details
granian-2.8.3-cp315-cp315t-manylinux_2_28_aarch64.whl CPython 3.15 CPython 3.15 free-threading Linux glibc 2.28+ ARM64 Details
granian-2.8.3-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.3-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.3-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.3-cp315-cp315t-macosx_11_0_arm64.whl CPython 3.15 CPython 3.15 free-threading macOS 11.0+ ARM64 Details
granian-2.8.3-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.3-cp315-cp315-win_amd64.whl CPython 3.15 CPython 3.15 Windows x86-64 Details
granian-2.8.3-cp315-cp315-musllinux_1_1_x86_64.whl CPython 3.15 CPython 3.15 Linux musl 1.1+ x86-64 Details
granian-2.8.3-cp315-cp315-musllinux_1_1_armv7l.whl CPython 3.15 CPython 3.15 Linux musl 1.1+ ARMv7l Details
granian-2.8.3-cp315-cp315-musllinux_1_1_aarch64.whl CPython 3.15 CPython 3.15 Linux musl 1.1+ ARM64 Details
granian-2.8.3-cp315-cp315-manylinux_2_28_aarch64.whl CPython 3.15 CPython 3.15 Linux glibc 2.28+ ARM64 Details
granian-2.8.3-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.3-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.3-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl CPython 3.15 CPython 3.15 Linux glibc 2.17+ ARMv7l Details
granian-2.8.3-cp315-cp315-macosx_11_0_arm64.whl CPython 3.15 CPython 3.15 macOS 11.0+ ARM64 Details
granian-2.8.3-cp315-cp315-macosx_10_12_x86_64.whl CPython 3.15 CPython 3.15 macOS 10.12+ x86-64 Details
granian-2.8.3-cp314-cp314t-win_amd64.whl CPython 3.14 CPython 3.14 free-threading Windows x86-64 Details
granian-2.8.3-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.3-cp314-cp314t-musllinux_1_1_armv7l.whl CPython 3.14 CPython 3.14 free-threading Linux musl 1.1+ ARMv7l Details
granian-2.8.3-cp314-cp314t-musllinux_1_1_aarch64.whl CPython 3.14 CPython 3.14 free-threading Linux musl 1.1+ ARM64 Details
granian-2.8.3-cp314-cp314t-manylinux_2_28_aarch64.whl CPython 3.14 CPython 3.14 free-threading Linux glibc 2.28+ ARM64 Details
granian-2.8.3-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.3-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.3-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.3-cp314-cp314t-macosx_11_0_arm64.whl CPython 3.14 CPython 3.14 free-threading macOS 11.0+ ARM64 Details
granian-2.8.3-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.3-cp314-cp314-win_amd64.whl CPython 3.14 CPython 3.14 Windows x86-64 Details
granian-2.8.3-cp314-cp314-musllinux_1_1_x86_64.whl CPython 3.14 CPython 3.14 Linux musl 1.1+ x86-64 Details
granian-2.8.3-cp314-cp314-musllinux_1_1_armv7l.whl CPython 3.14 CPython 3.14 Linux musl 1.1+ ARMv7l Details
granian-2.8.3-cp314-cp314-musllinux_1_1_aarch64.whl CPython 3.14 CPython 3.14 Linux musl 1.1+ ARM64 Details
granian-2.8.3-cp314-cp314-manylinux_2_28_aarch64.whl CPython 3.14 CPython 3.14 Linux glibc 2.28+ ARM64 Details
granian-2.8.3-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.3-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.3-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl CPython 3.14 CPython 3.14 Linux glibc 2.17+ ARMv7l Details
granian-2.8.3-cp314-cp314-macosx_11_0_arm64.whl CPython 3.14 CPython 3.14 macOS 11.0+ ARM64 Details
granian-2.8.3-cp314-cp314-macosx_10_12_x86_64.whl CPython 3.14 CPython 3.14 macOS 10.12+ x86-64 Details
granian-2.8.3-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details
granian-2.8.3-cp313-cp313-musllinux_1_1_x86_64.whl CPython 3.13 CPython 3.13 Linux musl 1.1+ x86-64 Details
granian-2.8.3-cp313-cp313-musllinux_1_1_armv7l.whl CPython 3.13 CPython 3.13 Linux musl 1.1+ ARMv7l Details
granian-2.8.3-cp313-cp313-musllinux_1_1_aarch64.whl CPython 3.13 CPython 3.13 Linux musl 1.1+ ARM64 Details
granian-2.8.3-cp313-cp313-manylinux_2_28_aarch64.whl CPython 3.13 CPython 3.13 Linux glibc 2.28+ ARM64 Details
granian-2.8.3-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.3-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.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl CPython 3.13 CPython 3.13 Linux glibc 2.17+ ARMv7l Details
granian-2.8.3-cp313-cp313-macosx_11_0_arm64.whl CPython 3.13 CPython 3.13 macOS 11.0+ ARM64 Details
granian-2.8.3-cp313-cp313-macosx_10_12_x86_64.whl CPython 3.13 CPython 3.13 macOS 10.12+ x86-64 Details
granian-2.8.3-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details
granian-2.8.3-cp312-cp312-musllinux_1_1_x86_64.whl CPython 3.12 CPython 3.12 Linux musl 1.1+ x86-64 Details
granian-2.8.3-cp312-cp312-musllinux_1_1_armv7l.whl CPython 3.12 CPython 3.12 Linux musl 1.1+ ARMv7l Details
granian-2.8.3-cp312-cp312-musllinux_1_1_aarch64.whl CPython 3.12 CPython 3.12 Linux musl 1.1+ ARM64 Details
granian-2.8.3-cp312-cp312-manylinux_2_28_aarch64.whl CPython 3.12 CPython 3.12 Linux glibc 2.28+ ARM64 Details
granian-2.8.3-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.3-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.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl CPython 3.12 CPython 3.12 Linux glibc 2.17+ ARMv7l Details
granian-2.8.3-cp312-cp312-macosx_11_0_arm64.whl CPython 3.12 CPython 3.12 macOS 11.0+ ARM64 Details
granian-2.8.3-cp312-cp312-macosx_10_12_x86_64.whl CPython 3.12 CPython 3.12 macOS 10.12+ x86-64 Details
granian-2.8.3-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details
granian-2.8.3-cp311-cp311-musllinux_1_1_x86_64.whl CPython 3.11 CPython 3.11 Linux musl 1.1+ x86-64 Details
granian-2.8.3-cp311-cp311-musllinux_1_1_armv7l.whl CPython 3.11 CPython 3.11 Linux musl 1.1+ ARMv7l Details
granian-2.8.3-cp311-cp311-musllinux_1_1_aarch64.whl CPython 3.11 CPython 3.11 Linux musl 1.1+ ARM64 Details
granian-2.8.3-cp311-cp311-manylinux_2_28_aarch64.whl CPython 3.11 CPython 3.11 Linux glibc 2.28+ ARM64 Details
granian-2.8.3-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.3-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.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl CPython 3.11 CPython 3.11 Linux glibc 2.17+ ARMv7l Details
granian-2.8.3-cp311-cp311-macosx_11_0_arm64.whl CPython 3.11 CPython 3.11 macOS 11.0+ ARM64 Details
granian-2.8.3-cp311-cp311-macosx_10_12_x86_64.whl CPython 3.11 CPython 3.11 macOS 10.12+ x86-64 Details
granian-2.8.3-cp310-cp310-win_amd64.whl CPython 3.10 CPython 3.10 Windows x86-64 Details
granian-2.8.3-cp310-cp310-musllinux_1_1_x86_64.whl CPython 3.10 CPython 3.10 Linux musl 1.1+ x86-64 Details
granian-2.8.3-cp310-cp310-musllinux_1_1_armv7l.whl CPython 3.10 CPython 3.10 Linux musl 1.1+ ARMv7l Details
granian-2.8.3-cp310-cp310-musllinux_1_1_aarch64.whl CPython 3.10 CPython 3.10 Linux musl 1.1+ ARM64 Details
granian-2.8.3-cp310-cp310-manylinux_2_28_aarch64.whl CPython 3.10 CPython 3.10 Linux glibc 2.28+ ARM64 Details
granian-2.8.3-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.3-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.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl CPython 3.10 CPython 3.10 Linux glibc 2.17+ ARMv7l Details
granian-2.8.3-cp310-cp310-macosx_11_0_arm64.whl CPython 3.10 CPython 3.10 macOS 11.0+ ARM64 Details
granian-2.8.3-cp310-cp310-macosx_10_12_x86_64.whl CPython 3.10 CPython 3.10 macOS 10.12+ x86-64 Details

Total release size: 416.5 MB

Release files / granian-2.8.3.tar.gz

Download URL granian-2.8.3.tar.gz
Size 130.3 kB
Tags Source
SHA-256 checksum
How to use checksums
482315abc9dca49051e4246a0bf2f09a1349a9a8d554111657559e038c91a6c4
BLAKE2b-256 checksum
How to use checksums
bb42bba335017a43cfe33da63685f341a9e21a9725e02f7f42a7be812234e1c4
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.3-pp311-pypy311_pp73-win_amd64.whl

Download URL granian-2.8.3-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
542bd8b4c7307e2a5f39898b76fbca3f96b87a096aa15c594ca6d21ac6fc74ee
BLAKE2b-256 checksum
How to use checksums
5d42f90e35a2ab6bf0418ecbdb3755cea37c2af0b99e14fae2e0795be4645053
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.3-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl

Download URL granian-2.8.3-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl
Size 5.1 MB
Tags Linux musl 1.1+ x86-64 PyPy 3.11 PyPy 3.11 7.3
SHA-256 checksum
How to use checksums
1bfa3671601b650acc9305a92d153f458fc16a2f7837c9836859a5771ec6fe1e
BLAKE2b-256 checksum
How to use checksums
c8550db1b74c541676a72cf3d2943877ba9768a06b6a3c4eb944f6e63d6dbd3f
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.3-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl

Download URL granian-2.8.3-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
093b2c252d42042035e211d42dcf56ec9234259a420d2895eb1858561505df07
BLAKE2b-256 checksum
How to use checksums
90fa162dc8566b93d648ac25bba7fba3afc5c646e23d05a5d84534e8b1fe4d69
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.3-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl

Download URL granian-2.8.3-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl
Size 5.2 MB
Tags Linux musl 1.1+ ARM64 PyPy 3.11 PyPy 3.11 7.3
SHA-256 checksum
How to use checksums
41ce63164eb08dcc89f982cc49f112416f9ae68fca20e91c93c51f17aac4abd2
BLAKE2b-256 checksum
How to use checksums
d383f130dac147b18a71862faccc4720cdd84f53ce664e4401f423aa94cca717
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.3-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl

Download URL granian-2.8.3-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
52ecb88657b5371563d4a00a5a4f497b14cc5f84da34a67a06781c6a7f1acb47
BLAKE2b-256 checksum
How to use checksums
ecdc57e5d254349e6dc5eeeea2fe388ad181b3d83d363f870c3bc39cfc73df9d
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.3-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL granian-2.8.3-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 5.0 MB
Tags Linux glibc 2.17+ x86-64 PyPy 3.11 PyPy 3.11 7.3
SHA-256 checksum
How to use checksums
d62782ace29b34cc0d2c34856ebb86b3520e7414fabf2b50c956267f25d42ced
BLAKE2b-256 checksum
How to use checksums
eba5eb795da758197bc133b6f2b4c61b86b9fca6efc527473f9e72975fd37354
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.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl

Download URL granian-2.8.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl
Size 4.5 MB
Tags PyPy 3.11 PyPy 3.11 7.3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
c2eb0cb2c3ae4f154e0a8a7c458b4edf7793a27cd2506f533c296bd8bc83b304
BLAKE2b-256 checksum
How to use checksums
ea1aaaa05bbe90c120267cb9b9d54addd689ceba58beda5da01b57dc27346bd4
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.3-pp311-pypy311_pp73-macosx_10_12_x86_64.whl

Download URL granian-2.8.3-pp311-pypy311_pp73-macosx_10_12_x86_64.whl
Size 4.7 MB
Tags PyPy 3.11 PyPy 3.11 7.3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
b50b319e38e37efc4f891b2a080f9b009d5d02f179c90d0c803b7de617472ff5
BLAKE2b-256 checksum
How to use checksums
f8808a6b7ac467185a150f9aa7910b381217270aa05ceb3f1280c1d0245621a7
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.3-cp315-cp315t-win_amd64.whl

Download URL granian-2.8.3-cp315-cp315t-win_amd64.whl
Size 3.2 MB
Tags CPython 3.15 CPython 3.15 free-threading Windows x86-64
SHA-256 checksum
How to use checksums
d706a87d311ebb916ee7ad9cccebcb070daabbbdd7964d4a222575bdcc2a63fb
BLAKE2b-256 checksum
How to use checksums
21b812ef3f0dd3b56108c284e2f1e18aa77d47f2c55b6eb0e822652cf1229f54
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.3-cp315-cp315t-musllinux_1_1_x86_64.whl

Download URL granian-2.8.3-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
031cfea8e03741311f6fee6cb3e95b77e57646045abfd38e8e32127e0118c5d1
BLAKE2b-256 checksum
How to use checksums
a4d2672a6c5f828c69e857bf367811aaffd910c07ddd0805fa6ffead1cc5d8bf
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.3-cp315-cp315t-musllinux_1_1_armv7l.whl

Download URL granian-2.8.3-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
4038f20cc558b9d2654c4222354f661b76eb5f4288eced373b8f0491a8cd4953
BLAKE2b-256 checksum
How to use checksums
8380e8a24a429e7ed21bcd504449dd0701775652754385f9b0478c5f8ac7fbf0
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.3-cp315-cp315t-musllinux_1_1_aarch64.whl

Download URL granian-2.8.3-cp315-cp315t-musllinux_1_1_aarch64.whl
Size 5.2 MB
Tags CPython 3.15 CPython 3.15 free-threading Linux musl 1.1+ ARM64
SHA-256 checksum
How to use checksums
cb18bd7ad158bf6bb9f10e2d1994ff0e73f9a44b37c237891cbf44ac3f353899
BLAKE2b-256 checksum
How to use checksums
955ae27e7d5791c543430d495937861c0fbe141c9dff11338b9cd56b36e5f488
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.3-cp315-cp315t-manylinux_2_28_aarch64.whl

Download URL granian-2.8.3-cp315-cp315t-manylinux_2_28_aarch64.whl
Size 5.0 MB
Tags CPython 3.15 CPython 3.15 free-threading Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
81faeabff381652216b983ee8adb84ead45b3613f58d6bc86e41cc27b31dbba8
BLAKE2b-256 checksum
How to use checksums
9af528f2d39fcb9837ac8b0e7a6b3cbaad7c2c44d48341f2d301059978ad3057
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.3-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL granian-2.8.3-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
389e02f85a32b0fccc3b0a29291f421138c0e6a1e519a9612e26eff3af25dedc
BLAKE2b-256 checksum
How to use checksums
d7dd7d887086572d4928e000bce7c2c701bf537bfa1d94a80469b9ef01720c8f
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.3-cp315-cp315t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl

Download URL granian-2.8.3-cp315-cp315t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Size 5.1 MB
Tags CPython 3.15 CPython 3.15 free-threading Linux glibc 2.17+ ARMv7l
SHA-256 checksum
How to use checksums
605872e2d726b8f0e66126045eb2eb38c0544cb7e8ea402563776d813ece2824
BLAKE2b-256 checksum
How to use checksums
79b7caa023b19eb4a6335e750e9520d1730e70d05b8eab5c0228c8fec73ad1cc
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.3-cp315-cp315t-manylinux_2_12_i686.manylinux2010_i686.whl

Download URL granian-2.8.3-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
371a0774532b51fb031d8000f38a1bdf0e6e1399ef5ea7d71d10dbbd281e9e75
BLAKE2b-256 checksum
How to use checksums
09b61cfb5d924d8dab434e563e70a7dddf28c91660f955746892932717dbdf6b
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.3-cp315-cp315t-macosx_11_0_arm64.whl

Download URL granian-2.8.3-cp315-cp315t-macosx_11_0_arm64.whl
Size 4.3 MB
Tags CPython 3.15 CPython 3.15 free-threading macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
8fecbfa4e1f2e4c7ada811c0e09eb3b9367471d5d1c49e9b5d24089360293d77
BLAKE2b-256 checksum
How to use checksums
3497b8012f967a0906c20a8e3747559ff9f5d4c8565caf383de746c476c23895
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.3-cp315-cp315t-macosx_10_12_x86_64.whl

Download URL granian-2.8.3-cp315-cp315t-macosx_10_12_x86_64.whl
Size 4.5 MB
Tags CPython 3.15 CPython 3.15 free-threading macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
c848fdfbfb9d55d560367c6d22fb0f857de8b26527f4d276d3c564aa849bac2c
BLAKE2b-256 checksum
How to use checksums
bdeb409b32b53f702724075f8a27c0a7413b17df11edb996ae583d390eb93dd8
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.3-cp315-cp315-win_amd64.whl

Download URL granian-2.8.3-cp315-cp315-win_amd64.whl
Size 3.1 MB
Tags CPython 3.15 Windows x86-64
SHA-256 checksum
How to use checksums
3fb6392c5a1afad77bf61de8eee50aade65a071cf37c2de47e9b23c6bef1ffbe
BLAKE2b-256 checksum
How to use checksums
6eae087a6f69e56017468f3f0e35061cd6e28163837d504b097fc662dc969d67
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.3-cp315-cp315-musllinux_1_1_x86_64.whl

Download URL granian-2.8.3-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
5f5a3e25302e5ac5e500d1bb67902488406fe88a4b159718443ec943c141bf2e
BLAKE2b-256 checksum
How to use checksums
105a9e2e3c7632afc1a1421cb44e908c1b0557c4dc0c726e7e63fdfe1cf8d8dd
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.3-cp315-cp315-musllinux_1_1_armv7l.whl

Download URL granian-2.8.3-cp315-cp315-musllinux_1_1_armv7l.whl
Size 5.2 MB
Tags CPython 3.15 Linux musl 1.1+ ARMv7l
SHA-256 checksum
How to use checksums
290b9cbb3aa46859c0c671e6b75d539e9c7c1b1d03de754856e1bc094f37b190
BLAKE2b-256 checksum
How to use checksums
7d82707ebec9fe24a4a71952dd6ef524c67599666a492e2e5f78d26705f73d8e
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.3-cp315-cp315-musllinux_1_1_aarch64.whl

Download URL granian-2.8.3-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
903f0a2f363ded893aad6cff427c2725166bcc2ee063d728c78058ab8cfd933d
BLAKE2b-256 checksum
How to use checksums
c8a742949e6b8db143664be22f8807220980a5065b6497273e64233c01c6fa9e
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.3-cp315-cp315-manylinux_2_28_aarch64.whl

Download URL granian-2.8.3-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
8b016f0ce0d7adcb512503c40afd28997f0a91f1839ce5afb16f6701ef85f8f5
BLAKE2b-256 checksum
How to use checksums
c115937c957ff9baf8543da34c01de1f172369063256f0cd2185c7b54c124975
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.3-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL granian-2.8.3-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
5e6946c862f0ec17f504681ed2bbf13c875bd2f565069d050156be853d9af20a
BLAKE2b-256 checksum
How to use checksums
629b77db659db0e64a45e756f56356fe37a6200779d7ae117183dddb8d27279a
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.3-cp315-cp315-manylinux_2_17_i686.manylinux2014_i686.whl

Download URL granian-2.8.3-cp315-cp315-manylinux_2_17_i686.manylinux2014_i686.whl
Size 4.7 MB
Tags CPython 3.15 Linux glibc 2.17+ x86-32
SHA-256 checksum
How to use checksums
92a1b1a69a60cda824f3a6635de5087926b7129802c004b1802837666b42f0aa
BLAKE2b-256 checksum
How to use checksums
c36ddec2379e1ee84d903dcd432b61db56f6a08afbb67959c6303a91544a0da2
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.3-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl

Download URL granian-2.8.3-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Size 5.1 MB
Tags CPython 3.15 Linux glibc 2.17+ ARMv7l
SHA-256 checksum
How to use checksums
8acb7b0738ed486a9daaf5eefac58c640904f03adc613548ac8df9241c4423f5
BLAKE2b-256 checksum
How to use checksums
67c0301382d3510f14c53f133affc260e0110e57ad99a1a9a0b042f96f741d49
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.3-cp315-cp315-macosx_11_0_arm64.whl

Download URL granian-2.8.3-cp315-cp315-macosx_11_0_arm64.whl
Size 4.4 MB
Tags CPython 3.15 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
b93319a5e8610779047433dfce1434d0d8699256dcae078c44e23990a20a0d5e
BLAKE2b-256 checksum
How to use checksums
466a3162b4025b4945971e14292fdbb6fa44f3aaa34bdf5dab75bc7418036773
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.3-cp315-cp315-macosx_10_12_x86_64.whl

Download URL granian-2.8.3-cp315-cp315-macosx_10_12_x86_64.whl
Size 4.6 MB
Tags CPython 3.15 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
2c4303122ef5690c286dbf1038edeed43ba8f44d523a0488fdb42cb5379a1f51
BLAKE2b-256 checksum
How to use checksums
cfe6983720195f0f91e82288830721b289c775a26bd404c19f6f3869c92cc3d2
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.3-cp314-cp314t-win_amd64.whl

Download URL granian-2.8.3-cp314-cp314t-win_amd64.whl
Size 3.2 MB
Tags CPython 3.14 CPython 3.14 free-threading Windows x86-64
SHA-256 checksum
How to use checksums
09b3d6e0ab86028770e89f8bd00f5ed6c78ba9d394376cff74d48541e33837c1
BLAKE2b-256 checksum
How to use checksums
e5c75baa1e9adda5c2f51721209bfc5580b7592c64fb9c4ec2499db6b6e9201c
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.3-cp314-cp314t-musllinux_1_1_x86_64.whl

Download URL granian-2.8.3-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
8757d7a0f4fd6b036da4380f170a9478e70ace84fc75f5d1d11d35e862083c9c
BLAKE2b-256 checksum
How to use checksums
940aea41431e196534be0555a106f6384e6efac7f5b416949a0d95a29e634d4f
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.3-cp314-cp314t-musllinux_1_1_armv7l.whl

Download URL granian-2.8.3-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
af0581770cce506000eefa16cfcc57c07759d25eb1aa258983d19785a7353c4c
BLAKE2b-256 checksum
How to use checksums
fdcecdef0b03fe1d5fa5aa4ccce721bc845facb3201c27581002046832cc5c50
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.3-cp314-cp314t-musllinux_1_1_aarch64.whl

Download URL granian-2.8.3-cp314-cp314t-musllinux_1_1_aarch64.whl
Size 5.2 MB
Tags CPython 3.14 CPython 3.14 free-threading Linux musl 1.1+ ARM64
SHA-256 checksum
How to use checksums
139c9f27aaaa212e82db8d0097e72ef3bcd279c3d522e2153ad51fe600277d78
BLAKE2b-256 checksum
How to use checksums
4320bb261857c5b11e567fdae01eddd58b551db0977393720185e72fb004be86
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.3-cp314-cp314t-manylinux_2_28_aarch64.whl

Download URL granian-2.8.3-cp314-cp314t-manylinux_2_28_aarch64.whl
Size 5.0 MB
Tags CPython 3.14 CPython 3.14 free-threading Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
bc561c8854d066bb6350ce9e3eb172589093bf6983f355117b7116d2ecae88f2
BLAKE2b-256 checksum
How to use checksums
5e4fc2fed6a281ce1d1a48558212d42f6c59f07ff557e19f043299f5b7ca4c0f
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.3-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL granian-2.8.3-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
52f09d7edd8b793a97a6daace55494ac639614f041b0c975e826cfd4c3ba55d7
BLAKE2b-256 checksum
How to use checksums
200fe2236d9cb79b9c9bc657f13dc3b08a3c8ddcfc82324cc7e6c1bc12d3d4ba
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.3-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl

Download URL granian-2.8.3-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Size 5.1 MB
Tags CPython 3.14 CPython 3.14 free-threading Linux glibc 2.17+ ARMv7l
SHA-256 checksum
How to use checksums
8bb65ed63dc61ea6f1201bd4b7f42864a898dde686649c34668fc8a716a1bc5a
BLAKE2b-256 checksum
How to use checksums
e6739f28b85dcd34bd2246ca2942a13b993ced4bdaec5527a75b518a6b230da5
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.3-cp314-cp314t-manylinux_2_12_i686.manylinux2010_i686.whl

Download URL granian-2.8.3-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
18b5f2aba8cc3666a5b9e38b0e76f07454e70ddd99d58d7c19ff293735997692
BLAKE2b-256 checksum
How to use checksums
bdd7d1441a70d5992f34857fb1a59d22b4038981aec7ea1cf3ba8c56384631c7
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.3-cp314-cp314t-macosx_11_0_arm64.whl

Download URL granian-2.8.3-cp314-cp314t-macosx_11_0_arm64.whl
Size 4.3 MB
Tags CPython 3.14 CPython 3.14 free-threading macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
bcac9ff2955ed231caf0e86a99d8aef144d040e8071852e726234917033eb65f
BLAKE2b-256 checksum
How to use checksums
3d5dad88db9e97a6b712e7c9e842f321b9dac39e1f2f9c5247095f2c5f4803ee
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.3-cp314-cp314t-macosx_10_12_x86_64.whl

Download URL granian-2.8.3-cp314-cp314t-macosx_10_12_x86_64.whl
Size 4.5 MB
Tags CPython 3.14 CPython 3.14 free-threading macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
61a4d3905f045cf4ec06e63100e6ae598d1d095ba5719009602ff64ea4e7c54f
BLAKE2b-256 checksum
How to use checksums
211a2501c0caaa0c1b08946c5b3a4ce9b0c7b7f5fcb2630c5bad9a93f000c7ec
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.3-cp314-cp314-win_amd64.whl

Download URL granian-2.8.3-cp314-cp314-win_amd64.whl
Size 3.1 MB
Tags CPython 3.14 Windows x86-64
SHA-256 checksum
How to use checksums
cdbba6d27d069eaa6415e5c928f0a14e878ecae1bd2462ff44591b94757f240e
BLAKE2b-256 checksum
How to use checksums
b21cce41852aeb4e8128c118175cfe884e319dc1d808b690f231edf841f32e8d
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.3-cp314-cp314-musllinux_1_1_x86_64.whl

Download URL granian-2.8.3-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
3528ce2692ac717ea090068708fe4aa8887264df10c6897dd72b8fc66b4e39c0
BLAKE2b-256 checksum
How to use checksums
33314bdf3c62a871945af994ad02ac7851f3160d1332031012d7c67cf4327c2c
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.3-cp314-cp314-musllinux_1_1_armv7l.whl

Download URL granian-2.8.3-cp314-cp314-musllinux_1_1_armv7l.whl
Size 5.2 MB
Tags CPython 3.14 Linux musl 1.1+ ARMv7l
SHA-256 checksum
How to use checksums
a366ed2412c1ac2e86472c081c672a0b1064290cbcd2910245090ad07a79ac09
BLAKE2b-256 checksum
How to use checksums
12cd7bdd806c30bd347af4b2f4d43a53ea0d66c5538d1a90fd728bcfa85033a4
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.3-cp314-cp314-musllinux_1_1_aarch64.whl

Download URL granian-2.8.3-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
333552f8fbc4f1dcb1322e4fac4eb05611240474b000baa0b5cb7f0c79cc9fcf
BLAKE2b-256 checksum
How to use checksums
0707abeb1e3861ca59a1748de23a30559954d5c6dfda42e88ba5e31fad53de32
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.3-cp314-cp314-manylinux_2_28_aarch64.whl

Download URL granian-2.8.3-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
6bbdab4a8536693ab8d7d8540d364c49941574e0d966c0e4566d147910391b89
BLAKE2b-256 checksum
How to use checksums
814aa8b9ccce669e75e0bdf569f1af390dbf13799ec26356119fd231b8b1a938
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.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL granian-2.8.3-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
9cae8210eac31ce005838628027676eef48c253fda16f5f635550e2636f9d4e2
BLAKE2b-256 checksum
How to use checksums
e81d3492782213b64e5b8cc72f782d706d87dd39bf5aea0f1672d42ca24ddf63
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.3-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl

Download URL granian-2.8.3-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl
Size 4.7 MB
Tags CPython 3.14 Linux glibc 2.17+ x86-32
SHA-256 checksum
How to use checksums
39bd25c9a071b76c8464e33c170a9e21a14518c73ef1600b93bded6f73a827f3
BLAKE2b-256 checksum
How to use checksums
79157857d66c092f6dde5e71235fbfd530be3499f694e1179f163a0b16138c8d
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.3-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl

Download URL granian-2.8.3-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Size 5.1 MB
Tags CPython 3.14 Linux glibc 2.17+ ARMv7l
SHA-256 checksum
How to use checksums
0f91937035f5cb01786ef62a5b0f503bd1e0015033f97ee9097ccf9194dc844d
BLAKE2b-256 checksum
How to use checksums
d082a5762677254a3d3b84333c220bf8232be6b51c52e1bdf1d3575e6b8c57c2
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.3-cp314-cp314-macosx_11_0_arm64.whl

Download URL granian-2.8.3-cp314-cp314-macosx_11_0_arm64.whl
Size 4.4 MB
Tags CPython 3.14 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
2560ed682322163d15028632e105d8612db32ff3bbb1c41b4ca6b4313fce9c1f
BLAKE2b-256 checksum
How to use checksums
2db73c5915bd24aa51ec9dd53a7b7f60bb58b16834bebe9af63c99c1f70f5d3f
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.3-cp314-cp314-macosx_10_12_x86_64.whl

Download URL granian-2.8.3-cp314-cp314-macosx_10_12_x86_64.whl
Size 4.6 MB
Tags CPython 3.14 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
dd8bb58171d0a2b8f070c95e615b5bd3f8c51626dec3b8ce4df9ef69958e5f85
BLAKE2b-256 checksum
How to use checksums
663c51da6a5945c69a1d21dc1f65f5681c08d444a033b3021a55d17ef803face
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.3-cp313-cp313-win_amd64.whl

Download URL granian-2.8.3-cp313-cp313-win_amd64.whl
Size 3.2 MB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
67c720028bb04a2f8acfe96aadd2bfdd748e240027fd4b832611db62fe61d0b0
BLAKE2b-256 checksum
How to use checksums
152777dbfbefaca84136c14389780f49bdcc491c12856e7427801ecc3b990f44
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.3-cp313-cp313-musllinux_1_1_x86_64.whl

Download URL granian-2.8.3-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
850371eb3545c08d0f2817bce0f6de555ebf7eb34a2da75c59248c68cf29e148
BLAKE2b-256 checksum
How to use checksums
b8a23e443be05ccb3c0b0b0cedf82225a37bd7ad34f9844bf8e8c56c325067c9
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.3-cp313-cp313-musllinux_1_1_armv7l.whl

Download URL granian-2.8.3-cp313-cp313-musllinux_1_1_armv7l.whl
Size 5.2 MB
Tags CPython 3.13 Linux musl 1.1+ ARMv7l
SHA-256 checksum
How to use checksums
90036622768e05f57c519b5489acd6b36c84cfe5641fc2f88144966d9476d883
BLAKE2b-256 checksum
How to use checksums
d57a97b1e8c70ccb58d15ecca0ea9f46e343f56b4ccac004ff2589f26a083225
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.3-cp313-cp313-musllinux_1_1_aarch64.whl

Download URL granian-2.8.3-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
b37c236b7cff81e1859c0d8848f92e5446218cae60190440ff9c6009795f385b
BLAKE2b-256 checksum
How to use checksums
b71ebb97ba01caa0e13534b6378490618b0bcf79d2ac95acd0e78ff4279b9250
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.3-cp313-cp313-manylinux_2_28_aarch64.whl

Download URL granian-2.8.3-cp313-cp313-manylinux_2_28_aarch64.whl
Size 5.2 MB
Tags CPython 3.13 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
605b2c86d6ea41f6ef9061da6d19f63003de0fd558efa1681cecab8025c8f872
BLAKE2b-256 checksum
How to use checksums
99c5b769a1eb34915f1329bc26877e9352ecd6d7ba88880477a996f459000a97
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.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL granian-2.8.3-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
586c3897aad0292dd8117663ff8eb09baf2ecdce475051eb4947e2bc9ff2ce86
BLAKE2b-256 checksum
How to use checksums
e7149716c59d4abbe5b17163d59c271dca1157e304894ef7268dab28db3d8735
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.3-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl

Download URL granian-2.8.3-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl
Size 4.7 MB
Tags CPython 3.13 Linux glibc 2.17+ x86-32
SHA-256 checksum
How to use checksums
550d1717955abb2fc208080c11cb2438f0f63285519765cc6cea17877634fd93
BLAKE2b-256 checksum
How to use checksums
bff8d965efa40bbecbacbe39fa32f6333c00d9e55e2fa258d4e994f951a2bcc5
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.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl

Download URL granian-2.8.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Size 5.1 MB
Tags CPython 3.13 Linux glibc 2.17+ ARMv7l
SHA-256 checksum
How to use checksums
ae493c3a431fca1c35a36d66d1cbf6dbbb35f4157fdcda6f5147390baba9f7d3
BLAKE2b-256 checksum
How to use checksums
6f0f6cb92c325c8b782a72c3ab8080d52db1ae1e938ff811140d7ac1c3e8a780
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.3-cp313-cp313-macosx_11_0_arm64.whl

Download URL granian-2.8.3-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
61449f75aee47fd7a0732d0d7e7ff44e8f3a62059d581791cc5cd0033ba91f79
BLAKE2b-256 checksum
How to use checksums
c4031c351182b49c7589b8fff4391133eb17523f531e7115b51fe6a8619a529a
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.3-cp313-cp313-macosx_10_12_x86_64.whl

Download URL granian-2.8.3-cp313-cp313-macosx_10_12_x86_64.whl
Size 4.6 MB
Tags CPython 3.13 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
d414ad9e416512ab28fcb20462ef38cbd57a0ee120a2df8a65e9267e7ccdddc3
BLAKE2b-256 checksum
How to use checksums
f96b56951af47882ebb679cbcf7bbfeef741fefedf0406e26ba78a996672cdec
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.3-cp312-cp312-win_amd64.whl

Download URL granian-2.8.3-cp312-cp312-win_amd64.whl
Size 3.2 MB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
23a4d63a2ee6bd921d089c8ff29d57dada9d947452bf277ef54651ba18225d22
BLAKE2b-256 checksum
How to use checksums
80aa7c44c4e506da6a72374b2ec5a80c0495f5f276119980462d3cbd97a80749
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.3-cp312-cp312-musllinux_1_1_x86_64.whl

Download URL granian-2.8.3-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
52b2c61a887960d45e6d93bb94efba94ec58708e8008213c14cd2a54771e2d91
BLAKE2b-256 checksum
How to use checksums
edcb1e42765c9737d2d7738b25e9a68260e73351ecbc072afc4ca794a97599cd
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.3-cp312-cp312-musllinux_1_1_armv7l.whl

Download URL granian-2.8.3-cp312-cp312-musllinux_1_1_armv7l.whl
Size 5.2 MB
Tags CPython 3.12 Linux musl 1.1+ ARMv7l
SHA-256 checksum
How to use checksums
09f260b336b58e68cd55f053e8148e6af5285e77a49237eb82a74ad1c3f9b402
BLAKE2b-256 checksum
How to use checksums
bb3ee63149887e692efda99a1314ec48d3894d2e770744feb9553d9a61d2591b
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.3-cp312-cp312-musllinux_1_1_aarch64.whl

Download URL granian-2.8.3-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
63ec6ee2cbcccb785544c7bc3a6dc1d3dc7733436e2a4cbb39260457d15030c0
BLAKE2b-256 checksum
How to use checksums
34f649a6a222096b0d40fb775f9534a162871a836e271f9f65cf730d1e699650
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.3-cp312-cp312-manylinux_2_28_aarch64.whl

Download URL granian-2.8.3-cp312-cp312-manylinux_2_28_aarch64.whl
Size 5.2 MB
Tags CPython 3.12 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
6743eab55ea482bbf3c6df210b75feaaa4d4a1fabf89781aaa701441bc61a5b4
BLAKE2b-256 checksum
How to use checksums
7b2d004edb40e1d0b055493bc4e85f8f1f238ac1b4269e118e69aef034aea7d8
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.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL granian-2.8.3-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
a1e2343d86b44c5aab4f621cf9cf7034afc9f5f99a708971ff4fc3d041fb509e
BLAKE2b-256 checksum
How to use checksums
639df2168173f485eba399269e6bcf66532ec2f697a64757c3f68b96c17f295f
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.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl

Download URL granian-2.8.3-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
40ddd6abd31a09c0deca63c41a2a00e49dd0328878f4b8047a9ac1828adfd940
BLAKE2b-256 checksum
How to use checksums
5a12c966430468b53fc6bc9abf33ddab2be969b0d0f33072ebabfdbfc0f5cbbe
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.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl

Download URL granian-2.8.3-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
aca584f74a8df88013641cf8d73bfdd0c072222d19939d82e90968849220c1b9
BLAKE2b-256 checksum
How to use checksums
f7cf765088a1d7a09cff9031418bbec7a70276c152a8fe306e67c3d110c768fd
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.3-cp312-cp312-macosx_11_0_arm64.whl

Download URL granian-2.8.3-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
f0c7bbfa3bf127e3577f61bcd1667e6ae7967366c629710d4e2327392ec4d517
BLAKE2b-256 checksum
How to use checksums
755ac0c9b102b19249c05929fce5e790c9e13ecceeb40b75dc52339dd3c66b8e
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.3-cp312-cp312-macosx_10_12_x86_64.whl

Download URL granian-2.8.3-cp312-cp312-macosx_10_12_x86_64.whl
Size 4.6 MB
Tags CPython 3.12 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
cca5733a845ee2e48acd0c1c48e897d4a01b19186d0b203a41aa95d2f6cbba07
BLAKE2b-256 checksum
How to use checksums
a234760b77cb8dd6e95e127c6408a77e2e5d063ac40524a7013f98858ffb0f1d
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.3-cp311-cp311-win_amd64.whl

Download URL granian-2.8.3-cp311-cp311-win_amd64.whl
Size 3.2 MB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
3f609935806365b45698c7f7b5f7ba72703f40632220901e9dfeec6bf6f25430
BLAKE2b-256 checksum
How to use checksums
168a8d4f4d2d0fdad49e44b008ee15d204067c2a6c72c4e1c3dda4140dec5e17
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.3-cp311-cp311-musllinux_1_1_x86_64.whl

Download URL granian-2.8.3-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
ca7c376d2c6af1b4895d16120aba7747b277c2b5361853e9343c485202945c29
BLAKE2b-256 checksum
How to use checksums
39965e41ddb250f9a0595c91d1ffbf1b2eb2b8ab8eebcc2d5ff67e400916f610
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.3-cp311-cp311-musllinux_1_1_armv7l.whl

Download URL granian-2.8.3-cp311-cp311-musllinux_1_1_armv7l.whl
Size 5.2 MB
Tags CPython 3.11 Linux musl 1.1+ ARMv7l
SHA-256 checksum
How to use checksums
b1d518b0b5f6caa56b2cc62563a4f19e248cd879ccffebe5491c5641b7e8986b
BLAKE2b-256 checksum
How to use checksums
33cc31a334e2c698736627a637633109bf45aa9842c2d07018a8f5307939345f
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.3-cp311-cp311-musllinux_1_1_aarch64.whl

Download URL granian-2.8.3-cp311-cp311-musllinux_1_1_aarch64.whl
Size 5.1 MB
Tags CPython 3.11 Linux musl 1.1+ ARM64
SHA-256 checksum
How to use checksums
4aff0b9bb431c4cffb24526ebd488fb3b283e4effcee3884a0df5741b1d215c1
BLAKE2b-256 checksum
How to use checksums
6d23de65b3c811795a6a1f885a824aab01002af986ba35dc35be6754dcdd75a4
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.3-cp311-cp311-manylinux_2_28_aarch64.whl

Download URL granian-2.8.3-cp311-cp311-manylinux_2_28_aarch64.whl
Size 5.1 MB
Tags CPython 3.11 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
b00ff44755940470ce34a4d02af96c4d69bbb51d7c06908920329d6b68f12ced
BLAKE2b-256 checksum
How to use checksums
4f03f5a802a31540318a68109daa9ee9d82dc5622bc2c96dbfa0eed6f615d639
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.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL granian-2.8.3-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
487375011d507af63a6551d5def19ee5fb1b77dc1e76fb3624c158485f5d4c83
BLAKE2b-256 checksum
How to use checksums
744d8bcd6156e08db6c2d1662c0f4683db2135d7ad3f06290e74198fda28cb5c
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.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl

Download URL granian-2.8.3-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
573746390796c72b6855a909dd64fe1c771a3a56b078bfe4544dadeb391f0d2b
BLAKE2b-256 checksum
How to use checksums
967dc474e53842bcc2e4680c5276d4ca055bfc878126713f0e2771f557e98971
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.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl

Download URL granian-2.8.3-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
b8ca381a596dc6dff17691281e3a30268528b798a1d05eb991487e1764573ac0
BLAKE2b-256 checksum
How to use checksums
31164546df119c8a9d364b27658bc09cc38c9dab7ad8983e285c7e1ec8491874
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.3-cp311-cp311-macosx_11_0_arm64.whl

Download URL granian-2.8.3-cp311-cp311-macosx_11_0_arm64.whl
Size 4.3 MB
Tags CPython 3.11 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
a811f088d9ad628b4456543a3518ff78fec1e4ee9f24fbb2875f63c8c036a73a
BLAKE2b-256 checksum
How to use checksums
cf4811165d5769ff7d819e8fe3303b567ccae1e71f77b48ad2425a8d631fc72d
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.3-cp311-cp311-macosx_10_12_x86_64.whl

Download URL granian-2.8.3-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
181221f0628ac6d9d3e7b475741872bbf92c4b6d825aae1020ca499e0e78bc63
BLAKE2b-256 checksum
How to use checksums
62517c622c12fc37f8833b4337c457de70709b2b53c9fbe3f795f92981c3c417
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.3-cp310-cp310-win_amd64.whl

Download URL granian-2.8.3-cp310-cp310-win_amd64.whl
Size 3.2 MB
Tags CPython 3.10 Windows x86-64
SHA-256 checksum
How to use checksums
c64826c29d68e7f2aede4d10cb264b2643ab3d484fb062745bcbc90b3869daed
BLAKE2b-256 checksum
How to use checksums
d94d83d38d3526c9ccf182d0e197570844c6aaadfcf97737b9baaf6b10aceb09
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.3-cp310-cp310-musllinux_1_1_x86_64.whl

Download URL granian-2.8.3-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
297d6b6133ecceee86e8ca2b622ec7eaa5411fc32e010883205715118abd1328
BLAKE2b-256 checksum
How to use checksums
ff7f9c1679053b3c6bbbe7206825895d437b1e96a79929f11962f14e68ffb3fa
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.3-cp310-cp310-musllinux_1_1_armv7l.whl

Download URL granian-2.8.3-cp310-cp310-musllinux_1_1_armv7l.whl
Size 5.1 MB
Tags CPython 3.10 Linux musl 1.1+ ARMv7l
SHA-256 checksum
How to use checksums
8e760973d1db0b5f1e50c7f2e158b9943676bbbfcf622c14ac1ddd5257cd54a9
BLAKE2b-256 checksum
How to use checksums
9db3b2f69e98a3540f8e900fea0e3e80c9146dd336bb444e9fe09dc31a2a07ae
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.3-cp310-cp310-musllinux_1_1_aarch64.whl

Download URL granian-2.8.3-cp310-cp310-musllinux_1_1_aarch64.whl
Size 5.1 MB
Tags CPython 3.10 Linux musl 1.1+ ARM64
SHA-256 checksum
How to use checksums
89b118e0e2105d3200086eecc57748e7a23c11fda96e8b47637ad847b1fa523c
BLAKE2b-256 checksum
How to use checksums
a379a5a5c4e23e97e899808ca6210585cb4aa0ac9c7fa47000974178f5193922
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.3-cp310-cp310-manylinux_2_28_aarch64.whl

Download URL granian-2.8.3-cp310-cp310-manylinux_2_28_aarch64.whl
Size 5.1 MB
Tags CPython 3.10 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
1c0f03a58c7d20d4e6087aed150597b88588c719a9b252ec4938982e4aefa43e
BLAKE2b-256 checksum
How to use checksums
3c3c7ded27e876095e32f24d6589c8c5e367ad269972b9103fb5046ebaeac9dc
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.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL granian-2.8.3-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
ab914496d0132142074eb1a245d531199dd217300bfc6eed126b765b4dcb0ce1
BLAKE2b-256 checksum
How to use checksums
3af9b2f5a2fcfdf24d6eb3724ee6e453b8d4a5de631dc3557c41f0f85ee0d0c5
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.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl

Download URL granian-2.8.3-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
e3b37aed51ac45c80730a9085ac93dfe63b74ea1090af5de32117add0ccc71ab
BLAKE2b-256 checksum
How to use checksums
80d116a07c568afda85cdc004b0ad002efccc8ac730e4cb25ffb250d933def9c
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.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl

Download URL granian-2.8.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Size 5.0 MB
Tags CPython 3.10 Linux glibc 2.17+ ARMv7l
SHA-256 checksum
How to use checksums
a53911bd510db71d93e728c2f188fb8236c3578cd1eebcbf8944214e8c59be2c
BLAKE2b-256 checksum
How to use checksums
db7f431a8f1270e3fdd31246a3e444d176ca549680443dc454868e19686d7bfb
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.3-cp310-cp310-macosx_11_0_arm64.whl

Download URL granian-2.8.3-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
d7d406e57da2bc7ae4248a31c1ce2e47f0db3f95a0b3eb270c9119904b97794b
BLAKE2b-256 checksum
How to use checksums
ec4ef9a38cb4507b4abad552d91d918a67d00a32fa6132617385992a7e694b03
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.3-cp310-cp310-macosx_10_12_x86_64.whl

Download URL granian-2.8.3-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
22e124091c041a81a9b3ee6c3f1c69cf9d21599187e1c6407e7d485656bd6f2e
BLAKE2b-256 checksum
How to use checksums
30afb18edc6115bae9b1c57f1d943b4ad3c4f4c5a800c225cfe9236fb02b6e3b
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.3 This release

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