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  [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.

Sockets and backlog

On Linux with TCP bindings, every Granian worker opens its own listening socket and the kernel distributes incoming connections across them. In this case, the backlog option applies to each worker's socket, thus the total amount of connections that can be queued by the kernel is backlog * workers.

On other platforms, and when binding to Unix Domain Sockets, workers share a single listening socket, thus the backlog is effectively global, as it's the size of one single queue.

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 socket queue – the network stack backlog provided by the OS kernel (and configured with the apposite parameter).

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

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

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

Runtime mode

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

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

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

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

Metrics

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

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

Static files

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

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

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

Serving a specific file for directory listings

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

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

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

Proxies and forwarded headers

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

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

from granian.utils.proxies import wrap_asgi_with_proxy_headers, wrap_wsgi_with_proxy_headers

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

def my_wsgi_app(environ, start_response):
    ...

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

With these wrappers, Granian will use:

and replace the relevant request scope attributes with these values.

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

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

Free-threaded Python

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

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

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

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

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

Customising Granian

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

AsyncIO event loop initialization

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

import asyncio
from granian import Granian, loops

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


Granian(...).serve()

Hooks

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

  • on_startup
  • on_shutdown
  • on_reload

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

from granian import Granian

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

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

Embedding Granian in your project

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

Warning: the embeddable server is still experimental.

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

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

from granian.server.embed import Server

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

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

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

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

  • stop
  • reload

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

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

Project status

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

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

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

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

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

License

Granian is released under the BSD License.

Metadata

Release files for granian 2.8.6

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.6
File Size Uploaded Provenance Actions
granian-2.8.6.tar.gz 131.2 kB Without provenance Details for granian-2.8.6.tar.gz

Built distributions (wheels)

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

Total release size: 410.5 MB

Release files / granian-2.8.6.tar.gz

Download URL granian-2.8.6.tar.gz
Size 131.2 kB
Tags Source
SHA-256 checksum
How to use checksums
3f17678e30710c7631cbb0b0a460b3020575dfb197cd161f430098d78e9bf713
BLAKE2b-256 checksum
How to use checksums
cac68959e9dc10c008084efa8cad1da4e378b84017cf19155ceab42c7ba4b44e
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.6-pp311-pypy311_pp73-win_amd64.whl

Download URL granian-2.8.6-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
cdbfcba6385dc3cbe0e8e93b45ee883fb700b5a3b99da02f73502078210f13c1
BLAKE2b-256 checksum
How to use checksums
f73fd9a5003f736bc107f1a8d392d6c260972d130b6136d781e371b00b491707
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.6-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl

Download URL granian-2.8.6-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
58ce1deab520c228e2e63f875467c0c3bb7185afec9d2e82c45086d2eafcc43d
BLAKE2b-256 checksum
How to use checksums
4f8ea2c59eddb42a99a15ef4d7ca5431112eaa9d9fd61ce61b6199aeef3ceeb3
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.6-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl

Download URL granian-2.8.6-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
8bcbbdf165835a6e653371b99d13f14a256e785369c9a0bf41cda0cb8551bd7e
BLAKE2b-256 checksum
How to use checksums
e7af2f8e813fe20e65fbf8a00162a9a54a8642d8f381c1f42e49096f2b75846d
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.6-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl

Download URL granian-2.8.6-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl
Size 5.1 MB
Tags Linux musl 1.1+ ARM64 PyPy 3.11 PyPy 3.11 7.3
SHA-256 checksum
How to use checksums
e87cea33449033558becfde5073393dea9c28158af262a882c76b7999b4f7b42
BLAKE2b-256 checksum
How to use checksums
4a1fa6c978ecf2dfe27cc8256a723ba67258a2e2fcb5638b04ff07aff068d502
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.6-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl

Download URL granian-2.8.6-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl
Size 5.1 MB
Tags Linux glibc 2.28+ ARM64 PyPy 3.11 PyPy 3.11 7.3
SHA-256 checksum
How to use checksums
40600c3257c03255bbc26e361769dd9f7a89543a276d1316abbae7b5a0b226ec
BLAKE2b-256 checksum
How to use checksums
81d5662b659c0f7f24cdc53d2e7c356bfc7bbd3920ba3b0c17214feaf88a4830
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.6-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL granian-2.8.6-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
dbd5f1872cbd2c494c937181c9e96ae49025db8fa63833ef66ce70a1f0d622ea
BLAKE2b-256 checksum
How to use checksums
63575c05632d68b13661b31b5f89f473a44db9c201dd2fa8b5ad4f03cb077d4a
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.6-pp311-pypy311_pp73-macosx_11_0_arm64.whl

Download URL granian-2.8.6-pp311-pypy311_pp73-macosx_11_0_arm64.whl
Size 4.3 MB
Tags PyPy 3.11 PyPy 3.11 7.3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
5308b62abe5063b129aa92555960daa74ed8b75fb101026dbbef9a5d7ba31448
BLAKE2b-256 checksum
How to use checksums
cf5905d5cb25e0011ff3c6fb371fea8bb3c9221f39c1a8ecc2edb5d3830befef
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.6-pp311-pypy311_pp73-macosx_10_12_x86_64.whl

Download URL granian-2.8.6-pp311-pypy311_pp73-macosx_10_12_x86_64.whl
Size 4.5 MB
Tags PyPy 3.11 PyPy 3.11 7.3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
06a6119ead037ebe4bc08975363d9b20301cd75c3b84d415be007a31fe9cf455
BLAKE2b-256 checksum
How to use checksums
91b1039cece1e39bee4805fb9d0cedb067fa48e58072603cdf0503f5063089a6
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.6-cp315-cp315t-win_amd64.whl

Download URL granian-2.8.6-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
5f3deb722dfd8894703b653281050811cb314cdf284d9e5d8d3dd8ea0297633e
BLAKE2b-256 checksum
How to use checksums
e0f77c5e67ad4a23a8047e11ac633cd567b06ff13cc2bf73a986553b6dbf5ce9
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.6-cp315-cp315t-musllinux_1_1_x86_64.whl

Download URL granian-2.8.6-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
5bbda419e9d925f60d6c5471365cb7b75485e54512f3935e5c847ea7450b9475
BLAKE2b-256 checksum
How to use checksums
d3b64f4182de81487bd7fffc0798d6dc6700e48b087a43f9e1a609f13f0b75de
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.6-cp315-cp315t-musllinux_1_1_armv7l.whl

Download URL granian-2.8.6-cp315-cp315t-musllinux_1_1_armv7l.whl
Size 5.0 MB
Tags CPython 3.15 CPython 3.15 free-threading Linux musl 1.1+ ARMv7l
SHA-256 checksum
How to use checksums
7384bc57a72f2ee4eb56ed60a800db612f10a1f52c062831f71290e0e0e1ddc4
BLAKE2b-256 checksum
How to use checksums
a0662ebae25e9795f53ce5dfaa8050ddb2b899515145b8a688893ce2aa8b751f
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.6-cp315-cp315t-musllinux_1_1_aarch64.whl

Download URL granian-2.8.6-cp315-cp315t-musllinux_1_1_aarch64.whl
Size 5.0 MB
Tags CPython 3.15 CPython 3.15 free-threading Linux musl 1.1+ ARM64
SHA-256 checksum
How to use checksums
66a99c987a2f8e2093c89573ef11d4786823d6002b8d94bb5e67c8def2da615c
BLAKE2b-256 checksum
How to use checksums
31dee4caa5ecbcf5f8147fe0fb914b4b5a04bde48df296099efe013d01bb9c64
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.6-cp315-cp315t-manylinux_2_28_aarch64.whl

Download URL granian-2.8.6-cp315-cp315t-manylinux_2_28_aarch64.whl
Size 4.8 MB
Tags CPython 3.15 CPython 3.15 free-threading Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
318c99a5c3b74cae9abdfbdcfd7e88850e19467ecf8589ad2a61e970f297adf4
BLAKE2b-256 checksum
How to use checksums
0fddaf88c904b16079cc27c6a3c5dff7d148fc37c2c0cd60473f55b4edd2ad6c
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.6-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL granian-2.8.6-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 4.8 MB
Tags CPython 3.15 CPython 3.15 free-threading Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
990940b23a536d2842c2699a4f114379d90975051ca755a24953fd0e63d418e0
BLAKE2b-256 checksum
How to use checksums
4df821a0df55da26a5ce07ff6c6780107a5374009e18ddcdd250eb781f230330
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.6-cp315-cp315t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl

Download URL granian-2.8.6-cp315-cp315t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Size 4.9 MB
Tags CPython 3.15 CPython 3.15 free-threading Linux glibc 2.17+ ARMv7l
SHA-256 checksum
How to use checksums
8e43102acd83b7c89a53aa6838d58466ab1065149a64223ae8808afb8b33997b
BLAKE2b-256 checksum
How to use checksums
a48d64db6ec9b9f132fed7908644c9fac48d87ac8cf06e8c537769299bf4119c
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.6-cp315-cp315t-manylinux_2_12_i686.manylinux2010_i686.whl

Download URL granian-2.8.6-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
c3371873cdb368af1fb9657c4cacf560cf7b5b705b1eae62eaa658b9be8c7cab
BLAKE2b-256 checksum
How to use checksums
c41a3cea2a682e76abe497bac48ababb8ab96a056f6b0993cf0e5bbe574a27ef
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.6-cp315-cp315t-macosx_11_0_arm64.whl

Download URL granian-2.8.6-cp315-cp315t-macosx_11_0_arm64.whl
Size 4.2 MB
Tags CPython 3.15 CPython 3.15 free-threading macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
8efab3e1ef400196ef2e000a4333b58894c93785486579651f2b9667a814204e
BLAKE2b-256 checksum
How to use checksums
fa77e03a48eba2a11ece1f7075ea500ffea2a3aa66b7e86d2153c84228d87d00
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.6-cp315-cp315t-macosx_10_12_x86_64.whl

Download URL granian-2.8.6-cp315-cp315t-macosx_10_12_x86_64.whl
Size 4.4 MB
Tags CPython 3.15 CPython 3.15 free-threading macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
28e76af6b27aea127034535c5c5ccb8204fc4dd01225bd74ae18e61e266d3585
BLAKE2b-256 checksum
How to use checksums
2d161d28e0189e6c570ba6708e8afd9af7f45323ecf27cbede4ba5448756f0fe
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.6-cp315-cp315-win_amd64.whl

Download URL granian-2.8.6-cp315-cp315-win_amd64.whl
Size 3.2 MB
Tags CPython 3.15 Windows x86-64
SHA-256 checksum
How to use checksums
9e29088da516125942d7d95fcbb7aa096808488b140f6ae78243adf9f4081331
BLAKE2b-256 checksum
How to use checksums
9f30296b639c72194dbea61d039c8d3982547ae2753a6cff15efba80912b97e8
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.6-cp315-cp315-musllinux_1_1_x86_64.whl

Download URL granian-2.8.6-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
36b260acb3e4c7a9f3d4c4d4bc282bbfa24af5e8773249200da2864e70304813
BLAKE2b-256 checksum
How to use checksums
2efa7d40dd2cd86bd8ad82e37407aa213bae974581ad1edbde95c4cafde52a16
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.6-cp315-cp315-musllinux_1_1_armv7l.whl

Download URL granian-2.8.6-cp315-cp315-musllinux_1_1_armv7l.whl
Size 5.0 MB
Tags CPython 3.15 Linux musl 1.1+ ARMv7l
SHA-256 checksum
How to use checksums
baff4a49f58f195bc88852889aa35a43ec5c117573f284abc07276755a40e5ab
BLAKE2b-256 checksum
How to use checksums
ec68600dea451c8d2a820414d4d765ce250a672530a2f1d03946ef86a9df3493
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.6-cp315-cp315-musllinux_1_1_aarch64.whl

Download URL granian-2.8.6-cp315-cp315-musllinux_1_1_aarch64.whl
Size 5.1 MB
Tags CPython 3.15 Linux musl 1.1+ ARM64
SHA-256 checksum
How to use checksums
2287712d456f9f6709e930bb067b63214455f10c41219c4593729b3f50906150
BLAKE2b-256 checksum
How to use checksums
184c1d02c7463bdf73eb1b55edfd48877c5e7a84076cece01421dbcd0f5428ed
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.6-cp315-cp315-manylinux_2_28_aarch64.whl

Download URL granian-2.8.6-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
9a0af6874b644d220079dfcfda9df535cc867e23ef08ff26a214682e95200829
BLAKE2b-256 checksum
How to use checksums
49d86396d1b17abe79cae5c2562145f4bb05f2483f87997349b4db264577e53d
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.6-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL granian-2.8.6-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
e00a3696788841f8ee01744549eafdc57b463ebda3d7e60f542e96c320fe9585
BLAKE2b-256 checksum
How to use checksums
a4761bedbb8af18a800022d34d913dd95c1240761f25cf11cc68662f9ae11b80
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.6-cp315-cp315-manylinux_2_17_i686.manylinux2014_i686.whl

Download URL granian-2.8.6-cp315-cp315-manylinux_2_17_i686.manylinux2014_i686.whl
Size 4.6 MB
Tags CPython 3.15 Linux glibc 2.17+ x86-32
SHA-256 checksum
How to use checksums
83b73f3e6890d0af4397eebbe94b20e7ba82b0077f4aee72452dc2c36fc40fbe
BLAKE2b-256 checksum
How to use checksums
a48218a2c3376356185ccaaf29b2b0007d82dc15d777f6ecb44ad8a92945aa31
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.6-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl

Download URL granian-2.8.6-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Size 5.0 MB
Tags CPython 3.15 Linux glibc 2.17+ ARMv7l
SHA-256 checksum
How to use checksums
391956cf34da85e2922bd3c4e8d2c49504760150b2ab9e2bae38815f974ee350
BLAKE2b-256 checksum
How to use checksums
fcf949e7b4983947bcbddfada9e0c68b582e35fe0c63ef872239825afd00beb7
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.6-cp315-cp315-macosx_11_0_arm64.whl

Download URL granian-2.8.6-cp315-cp315-macosx_11_0_arm64.whl
Size 4.3 MB
Tags CPython 3.15 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
9feabcb28e9d90b8d07f4f7c53898a7a60a797805c3a905e62bee455e76aa448
BLAKE2b-256 checksum
How to use checksums
6ec3718d34a5995529a061744a7badc62a9d17510ab3ed94275e25bb269dc768
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.6-cp315-cp315-macosx_10_12_x86_64.whl

Download URL granian-2.8.6-cp315-cp315-macosx_10_12_x86_64.whl
Size 4.5 MB
Tags CPython 3.15 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
b4f083d62f3900c9b89a5f120a5b543b2f698a25adb1f7db047f6657a1eb3211
BLAKE2b-256 checksum
How to use checksums
a2d274bd2e7f4e9b846bb11c1cdc56ec4d421326669dbeb4c96168e77202b086
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.6-cp314-cp314t-win_amd64.whl

Download URL granian-2.8.6-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
a7b0fc434dea4cb90d157cfc612fb6002482492b314d91e88a704780f23dabef
BLAKE2b-256 checksum
How to use checksums
55d77c506bf792f0b0f20452af8dc7521e7737beb212cb784ac356fbfc715c28
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.6-cp314-cp314t-musllinux_1_1_x86_64.whl

Download URL granian-2.8.6-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
4ea0e22c9d53b48a3a4b666952bb39fecbcc7c66ee6244537a5df8073d62286a
BLAKE2b-256 checksum
How to use checksums
2d79568a944b1aa3bebf0e024f72d51185ee5dfa6bb1c0f24766ca6415223cf1
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.6-cp314-cp314t-musllinux_1_1_armv7l.whl

Download URL granian-2.8.6-cp314-cp314t-musllinux_1_1_armv7l.whl
Size 5.0 MB
Tags CPython 3.14 CPython 3.14 free-threading Linux musl 1.1+ ARMv7l
SHA-256 checksum
How to use checksums
53d727e57250c063ce44c7252459f1d4a74b12b46fa636b0a8ff3e72087a0d42
BLAKE2b-256 checksum
How to use checksums
cc34ebb0d8d1df46eb5f00b1cdd6ec5c71083fe99f6609864220f77b1f6a77a3
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.6-cp314-cp314t-musllinux_1_1_aarch64.whl

Download URL granian-2.8.6-cp314-cp314t-musllinux_1_1_aarch64.whl
Size 5.0 MB
Tags CPython 3.14 CPython 3.14 free-threading Linux musl 1.1+ ARM64
SHA-256 checksum
How to use checksums
6fd12b757fec4a0314e06477feb14b63a94f2f74eaa97a53bb8fda03439cff57
BLAKE2b-256 checksum
How to use checksums
f94a8713cdea9d7c53e0f73dfbe66ae2e42549e5c333a838b53270627a561961
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.6-cp314-cp314t-manylinux_2_28_aarch64.whl

Download URL granian-2.8.6-cp314-cp314t-manylinux_2_28_aarch64.whl
Size 4.8 MB
Tags CPython 3.14 CPython 3.14 free-threading Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
5619d782066b16dc88103e8bf0e8dd00e44961260b836788675ea7e0ef04fbcf
BLAKE2b-256 checksum
How to use checksums
1d244f204a6e7c7e1bc5dedf36db4e81a74337188a2fbdff46b27f0a9e013d05
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.6-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL granian-2.8.6-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 4.8 MB
Tags CPython 3.14 CPython 3.14 free-threading Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
85996ff1febac4d74dbceff020faa42565c362688296e0a8cdcaaafd5913669e
BLAKE2b-256 checksum
How to use checksums
25793decadeab97c7e6373d2e9cb741e0ef4759612fcc9b6fd83fcc6dba540c4
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.6-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl

Download URL granian-2.8.6-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Size 4.9 MB
Tags CPython 3.14 CPython 3.14 free-threading Linux glibc 2.17+ ARMv7l
SHA-256 checksum
How to use checksums
0056053bb3e2979d1f57d8f23d2f6eb404634590816012747b65206e66d7849d
BLAKE2b-256 checksum
How to use checksums
11402e9a7f5efe788e8b5a231407c50a1e5250f772a4f28a3d8dd1d05c865e48
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.6-cp314-cp314t-manylinux_2_12_i686.manylinux2010_i686.whl

Download URL granian-2.8.6-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
c7ae2cd5427ef6e22e2c675992a61e6dc4b8f24a7d1a8315f6f76ed1f41faa2a
BLAKE2b-256 checksum
How to use checksums
aea95d30d7b684171b1882dd451ddc161c4e9e82d226a9c5a119fe94ff0c08d2
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.6-cp314-cp314t-macosx_11_0_arm64.whl

Download URL granian-2.8.6-cp314-cp314t-macosx_11_0_arm64.whl
Size 4.2 MB
Tags CPython 3.14 CPython 3.14 free-threading macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
73ec3ee32d6afa7021616e6880e3c63137b82a89068eb5eadbf775ec82b7a7a6
BLAKE2b-256 checksum
How to use checksums
fb2e867e82594924c6dc8a88c595ccd224664850cf8be53ac47889e74a2dd881
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.6-cp314-cp314t-macosx_10_12_x86_64.whl

Download URL granian-2.8.6-cp314-cp314t-macosx_10_12_x86_64.whl
Size 4.4 MB
Tags CPython 3.14 CPython 3.14 free-threading macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
fabe2caa8ab3c00acc7c4d4a31f2ca351a982a5cafc92333b78f5c66d5ab4c5d
BLAKE2b-256 checksum
How to use checksums
87a0c426e5bbe8de5651f01fcab70a95fb43c04972efd45070337d2e5186a7e3
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.6-cp314-cp314-win_amd64.whl

Download URL granian-2.8.6-cp314-cp314-win_amd64.whl
Size 3.2 MB
Tags CPython 3.14 Windows x86-64
SHA-256 checksum
How to use checksums
7b8e6f5127e895cb336a1fb5e3a6c6a167b8bc819897a341dc5699abad20a163
BLAKE2b-256 checksum
How to use checksums
00d00f606c7f21aa1aba56ddf0a5ec91664e92d81694a83cfdac72371b1b5a9c
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.6-cp314-cp314-musllinux_1_1_x86_64.whl

Download URL granian-2.8.6-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
aeb0e1b2b3fc6e1a6c86278e084b2a60b9bfcd132cdebc356e19a72d52f2bc4c
BLAKE2b-256 checksum
How to use checksums
63c70da4e1f5c8834338f27e03b02e915d7085b51ccd804aaef98d35d4c6b2e3
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.6-cp314-cp314-musllinux_1_1_armv7l.whl

Download URL granian-2.8.6-cp314-cp314-musllinux_1_1_armv7l.whl
Size 5.0 MB
Tags CPython 3.14 Linux musl 1.1+ ARMv7l
SHA-256 checksum
How to use checksums
4d6fbb7777a491f8fbc5017e6113e5d3cc2d7e618e25383c6b7569d640b6654c
BLAKE2b-256 checksum
How to use checksums
65552269eb1f804b0a2276ca5b253b7cb2bc3a44c6da2c10f859f01cb5b0a86d
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.6-cp314-cp314-musllinux_1_1_aarch64.whl

Download URL granian-2.8.6-cp314-cp314-musllinux_1_1_aarch64.whl
Size 5.1 MB
Tags CPython 3.14 Linux musl 1.1+ ARM64
SHA-256 checksum
How to use checksums
80ae8df36ca9f8f52a15767d27c1322d783ff3fcda2ec56640d354aab0cdf47e
BLAKE2b-256 checksum
How to use checksums
b58e8f0b9737ac62109664e8a32a9fa044045f7c18dd5d979a52858a1b3ad332
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.6-cp314-cp314-manylinux_2_28_aarch64.whl

Download URL granian-2.8.6-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
44dc048c145ef011a63547cc26ebe00d7324c02b366e2358145290875086fc5f
BLAKE2b-256 checksum
How to use checksums
f000bbac96cbbcc8f07c314f267c92317eaf0e5f449c0cb2da8d75084fce37fe
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.6-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL granian-2.8.6-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
8e0f92cfbcfd6529cfa2e17ca38ea91f2afc4dcc7eceeda568e2bf1a4be3789a
BLAKE2b-256 checksum
How to use checksums
fad1985ba45a0d43899060dc5aafcb7737708be14a9cad0fed9e624904f0b7a6
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.6-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl

Download URL granian-2.8.6-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl
Size 4.6 MB
Tags CPython 3.14 Linux glibc 2.17+ x86-32
SHA-256 checksum
How to use checksums
de787003546275e4504e7c2e184d2af2f992ca8807c92a2fdf72b49ad4bb0537
BLAKE2b-256 checksum
How to use checksums
a11b77d43a852687402aee415a161fe7f78dd46b2cfac574e6c563f1863713bf
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.6-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl

Download URL granian-2.8.6-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Size 5.0 MB
Tags CPython 3.14 Linux glibc 2.17+ ARMv7l
SHA-256 checksum
How to use checksums
c4423266733f916a9c8f8821dc7109cfb52f16ea5e53c73aa9d6a7983a8870c2
BLAKE2b-256 checksum
How to use checksums
9203dc792a0eddab309ec188b0ed2b273737f8d21711b87f63fe8e92de33da2c
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.6-cp314-cp314-macosx_11_0_arm64.whl

Download URL granian-2.8.6-cp314-cp314-macosx_11_0_arm64.whl
Size 4.3 MB
Tags CPython 3.14 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
fb991da45faffb451024e09883ee6b1433b36bb3636e54cbce476b4e6b0a0d82
BLAKE2b-256 checksum
How to use checksums
7b6d736c35c880196c5b2fb2785096699ac22f6f8264092a193779e84986c44a
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.6-cp314-cp314-macosx_10_12_x86_64.whl

Download URL granian-2.8.6-cp314-cp314-macosx_10_12_x86_64.whl
Size 4.5 MB
Tags CPython 3.14 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
130490ed9de103a9a3403181d1471be7dc01a1b63c2bb23efc6864a7e907adaa
BLAKE2b-256 checksum
How to use checksums
0e90e48d1338becd7b6292a5ff2b33697c3b80ad89fc060a58ad9e66d03607bc
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.6-cp313-cp313-win_amd64.whl

Download URL granian-2.8.6-cp313-cp313-win_amd64.whl
Size 3.2 MB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
f54f5fa28f86e4851eaee74456871d9ecc602195b1dedab8c3786f8d46b94f04
BLAKE2b-256 checksum
How to use checksums
60cf9ae1f6e471dff9237a635e24c35cedb8e4a2eaca98172abd3d24d95ba558
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.6-cp313-cp313-musllinux_1_1_x86_64.whl

Download URL granian-2.8.6-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
98b944d3228d34cc29c111c7bcc9634635040a0c4ed150991c4e111bcee4d4d4
BLAKE2b-256 checksum
How to use checksums
7e9a61cb363486ede927789bfb676cb297f32361e172159f4311738c55013e0b
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.6-cp313-cp313-musllinux_1_1_armv7l.whl

Download URL granian-2.8.6-cp313-cp313-musllinux_1_1_armv7l.whl
Size 5.1 MB
Tags CPython 3.13 Linux musl 1.1+ ARMv7l
SHA-256 checksum
How to use checksums
5da5b7819a1ca0be2077372df2f0a17454d176b2206e4c986f2484ab7556a3a7
BLAKE2b-256 checksum
How to use checksums
5d884af9ce7ada48c8517d4391f7c1c651cd986875d35de8c6809fa0d1606f8c
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.6-cp313-cp313-musllinux_1_1_aarch64.whl

Download URL granian-2.8.6-cp313-cp313-musllinux_1_1_aarch64.whl
Size 5.1 MB
Tags CPython 3.13 Linux musl 1.1+ ARM64
SHA-256 checksum
How to use checksums
7c267cdf0195682f26304b4f3acb7737dde7be2a2ee3bfda5c2398634f9f60a0
BLAKE2b-256 checksum
How to use checksums
9843d3a7c4197a43e50bcc0f1ed76f627e88e4a491ff17b3cb4899d2cd2d3de6
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.6-cp313-cp313-manylinux_2_28_aarch64.whl

Download URL granian-2.8.6-cp313-cp313-manylinux_2_28_aarch64.whl
Size 5.1 MB
Tags CPython 3.13 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
303814095d12e4937d78aaa8c3fe49d625e0fd26ae3e40a6b663de88699f19a0
BLAKE2b-256 checksum
How to use checksums
b3923f8502f884a8580d6f898cb648c596cbfed5952d6e93f2f7939b55e98c10
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.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL granian-2.8.6-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
28b4d4134d8b7e7d36f05a05ffc772e7b3b35cc9c92129af2da5862f77d27a56
BLAKE2b-256 checksum
How to use checksums
2f4c036f9b4455e50887a0faced7fbf26af948be6a8b2401784bccfe1f172a5f
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.6-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl

Download URL granian-2.8.6-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl
Size 4.6 MB
Tags CPython 3.13 Linux glibc 2.17+ x86-32
SHA-256 checksum
How to use checksums
1a092b389fbb890acb5a71237e5398f10e90dfe7251b4ade9a2fe8260fd08732
BLAKE2b-256 checksum
How to use checksums
231ff496f9fd05d12e5661fc373e44abef38a56782493756e6f859318426bfd4
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.6-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl

Download URL granian-2.8.6-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Size 5.0 MB
Tags CPython 3.13 Linux glibc 2.17+ ARMv7l
SHA-256 checksum
How to use checksums
58d17fe75ec3b605cbb7813d1bbaa3527ca73605420ecac77707c0d30f40502a
BLAKE2b-256 checksum
How to use checksums
98dd266a48c3dae3cb06a5622eb45548dc9423e178f0a06160641e0975d4832f
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.6-cp313-cp313-macosx_11_0_arm64.whl

Download URL granian-2.8.6-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
102af0fe73670bec7d004524a261e9669cb7a4b2ea630150a8bc5c2f21181fe0
BLAKE2b-256 checksum
How to use checksums
2510ae937f36c3b5dda6f9e0199e1fd5eec303c125ec6e1b42e5586e10f7112f
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.6-cp313-cp313-macosx_10_12_x86_64.whl

Download URL granian-2.8.6-cp313-cp313-macosx_10_12_x86_64.whl
Size 4.5 MB
Tags CPython 3.13 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
cd8c847f7d8f39918f7f69e2dcc3b45bc676a5fb18ad3172ae735c71c6bf81fd
BLAKE2b-256 checksum
How to use checksums
67abf15ef141aee7c207a354083a2fffc425102a88a84f1352bad8b9a2883735
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.6-cp312-cp312-win_amd64.whl

Download URL granian-2.8.6-cp312-cp312-win_amd64.whl
Size 3.2 MB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
98c29b2943d121e26a18e2d1a612dda64b139b3ab8b1f9e2c26d1f315c6de57e
BLAKE2b-256 checksum
How to use checksums
f7c5eb43a33b469cb9480dec2db66048586fef5f8ffd44083999666a1ceb3261
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.6-cp312-cp312-musllinux_1_1_x86_64.whl

Download URL granian-2.8.6-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
47e75721fd1a3b3b00304ad55b4c9f8788cf57c0169aa8ca20ab3f61ccf00206
BLAKE2b-256 checksum
How to use checksums
7d541e215f1c13c4ddda0c24641a31aed11d4d9a47047ff65734d48909c0df16
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.6-cp312-cp312-musllinux_1_1_armv7l.whl

Download URL granian-2.8.6-cp312-cp312-musllinux_1_1_armv7l.whl
Size 5.1 MB
Tags CPython 3.12 Linux musl 1.1+ ARMv7l
SHA-256 checksum
How to use checksums
394f16fc2c3374e943ef12290d81be7b85d9ef6042e975c0014fe5dacc2717a4
BLAKE2b-256 checksum
How to use checksums
2890abe21a38ee95985cd7ed44e5e9ffd30a0274e30483977d89bc97b7ff2e9d
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.6-cp312-cp312-musllinux_1_1_aarch64.whl

Download URL granian-2.8.6-cp312-cp312-musllinux_1_1_aarch64.whl
Size 5.1 MB
Tags CPython 3.12 Linux musl 1.1+ ARM64
SHA-256 checksum
How to use checksums
37722e3e8a2b10851a5e20ea5cf0ab041f40b471ebc16fe8d984229cb5241e7d
BLAKE2b-256 checksum
How to use checksums
8d717fcaa426a2f8cb19305426d6d3d123d8ec96c6b9cd0bfcfa650c7eaa7baa
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.6-cp312-cp312-manylinux_2_28_aarch64.whl

Download URL granian-2.8.6-cp312-cp312-manylinux_2_28_aarch64.whl
Size 5.0 MB
Tags CPython 3.12 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
fb706db900cc3df218585c09150f09f40d9c4084981f5021acc70f890ebb0b4b
BLAKE2b-256 checksum
How to use checksums
b467c39f85c6c8ba07c01605d54f7b39a2854d608a732b4d99527c76cbbeecaf
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.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL granian-2.8.6-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
1facd9b6ce47904fc1ed4168dee386104b38e9bec56febece2340e2fef41f27e
BLAKE2b-256 checksum
How to use checksums
7c57927f0bd08453af71ea2b59b5cbc58d02769db43c524a753712749b9cfeb2
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.6-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl

Download URL granian-2.8.6-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl
Size 4.6 MB
Tags CPython 3.12 Linux glibc 2.17+ x86-32
SHA-256 checksum
How to use checksums
cc240ca08342c115b634a5a23cd1da9072aace0b746e8724a0aea3dc07ea41b9
BLAKE2b-256 checksum
How to use checksums
99d46c347bf4f7f242d3b73f261977e95dabc7044ce4bc3da93ebc8cc30d88f2
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.6-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl

Download URL granian-2.8.6-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Size 5.0 MB
Tags CPython 3.12 Linux glibc 2.17+ ARMv7l
SHA-256 checksum
How to use checksums
15e640967199b75756840ccace4e5d23528e9de7d47645041df24c9981041a01
BLAKE2b-256 checksum
How to use checksums
6956026e569e49788dbc5555a95bee99fa9a4eea01a583969994fc1705c50ab4
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.6-cp312-cp312-macosx_11_0_arm64.whl

Download URL granian-2.8.6-cp312-cp312-macosx_11_0_arm64.whl
Size 4.2 MB
Tags CPython 3.12 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
de0431e2115bb560498a14da3489da2839c515303d6f7cb1c11978c766eece00
BLAKE2b-256 checksum
How to use checksums
ddb51cb14e2e45c315421b002cb2252b78b4fc9ef47137b8f2d63c9ed16f168a
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.6-cp312-cp312-macosx_10_12_x86_64.whl

Download URL granian-2.8.6-cp312-cp312-macosx_10_12_x86_64.whl
Size 4.5 MB
Tags CPython 3.12 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
a1ff43823005766d3302ebb8d95f87ae803fe5ef45a24e1d1bf7e2a0c922b5d9
BLAKE2b-256 checksum
How to use checksums
e4ceab98dae58faf0289afe08faf47424b226e52473f9a42ed8c38a95e66f90b
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.6-cp311-cp311-win_amd64.whl

Download URL granian-2.8.6-cp311-cp311-win_amd64.whl
Size 3.2 MB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
338cbb2dd1be1e298ce52318403975eaa718fd6ab44e42217d594ebd202a6a8c
BLAKE2b-256 checksum
How to use checksums
3e81b5c430609ff247274545f81ebc483b9fd8aa8960a8e9051edf0ae6d53454
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.6-cp311-cp311-musllinux_1_1_x86_64.whl

Download URL granian-2.8.6-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
dd66b99df248be4b06f50f41095b3a401cbe10e77aa103749f3dba3c6b90c589
BLAKE2b-256 checksum
How to use checksums
68a8246e3e87e3e28bbce82e19515dc6aa6ccf1d52c8065485fbdf37ec66ac4a
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.6-cp311-cp311-musllinux_1_1_armv7l.whl

Download URL granian-2.8.6-cp311-cp311-musllinux_1_1_armv7l.whl
Size 5.0 MB
Tags CPython 3.11 Linux musl 1.1+ ARMv7l
SHA-256 checksum
How to use checksums
9845d06ea5d6173c8305d99ebfb037966a78e9159968748f3db49c3db789cb45
BLAKE2b-256 checksum
How to use checksums
64003d519b265620c7a36c51a96d2b2a469e063465703627f7c4ecd965094f7e
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.6-cp311-cp311-musllinux_1_1_aarch64.whl

Download URL granian-2.8.6-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
9d96f344df45326ffa2156e10bfa902f791a06927345dbe9841f0eb2aa765c23
BLAKE2b-256 checksum
How to use checksums
e99c5c2453a674491611f7febdc0bdee3feda532d48d0d55d102a53af678a9dc
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.6-cp311-cp311-manylinux_2_28_aarch64.whl

Download URL granian-2.8.6-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
a124529d9c74fde05151dc3acafbe335f28957fefe00c224aa73ac1aca3e2a63
BLAKE2b-256 checksum
How to use checksums
2d3702f8b7288a5b1268e18da55f140ee1ea116ee8b7b438facea17393cc91da
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.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL granian-2.8.6-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
bd088e30c053d820a79a2f5a53aa0262f66c818f1264140f81e59e4d2bf741cd
BLAKE2b-256 checksum
How to use checksums
05d10acc01be9d75161ecd3a59a1f5066d75979554076c58ff7331f9c5c3a5aa
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.6-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl

Download URL granian-2.8.6-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
5f4f1d48dc4c47f4519fe6e2ab93a406a41d6599a94b1fcd2197ac6621b8a09a
BLAKE2b-256 checksum
How to use checksums
0cfdfd0665ec715c0b5814b36cd7854cb507c39ec388868348f9a81012cd5285
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.6-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl

Download URL granian-2.8.6-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
b9cb4ec0d158263d1f1be7f840ca05d585e749cac441c66a6c3778c1d7367808
BLAKE2b-256 checksum
How to use checksums
0a1d7d722f756ab4f334530c7e3bdad2ac6c47c26595018ef0104c87b457b03d
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.6-cp311-cp311-macosx_11_0_arm64.whl

Download URL granian-2.8.6-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
0c29abda6aa05a00698b5e066ff7a6217ff54514bd0f5c38b24d7c47c1cbb869
BLAKE2b-256 checksum
How to use checksums
e9c1f41d046dac96202e24ef94afdd2f6843f9d92dd3fd85f47f1f794c4877f1
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.6-cp311-cp311-macosx_10_12_x86_64.whl

Download URL granian-2.8.6-cp311-cp311-macosx_10_12_x86_64.whl
Size 4.5 MB
Tags CPython 3.11 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
0ecc4c70471faa07b155880711ce91e82f9ee265702322ce8f442452ba891ca5
BLAKE2b-256 checksum
How to use checksums
0b98828e24923617916315a3853de5a71f3ba61ac59883ddd3be710313444c10
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.6-cp310-cp310-win_amd64.whl

Download URL granian-2.8.6-cp310-cp310-win_amd64.whl
Size 3.3 MB
Tags CPython 3.10 Windows x86-64
SHA-256 checksum
How to use checksums
50fdd2901498187678499a6a78970f13d7a85d6bfbe41f022931de48608631a2
BLAKE2b-256 checksum
How to use checksums
d6c6a9360f4794cde793f3f0af3f749ba3fd4f268ac74eabcf39ba6d8ac0d331
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.6-cp310-cp310-musllinux_1_1_x86_64.whl

Download URL granian-2.8.6-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
9ce365a24fcc10b7fd78e76c4fe13696edfff1274503f57071a63fae530e9d71
BLAKE2b-256 checksum
How to use checksums
3a6bd209660037347ef77530160fd4b0e9ddbd2c884f96a52ded8637f97b9395
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.6-cp310-cp310-musllinux_1_1_armv7l.whl

Download URL granian-2.8.6-cp310-cp310-musllinux_1_1_armv7l.whl
Size 5.0 MB
Tags CPython 3.10 Linux musl 1.1+ ARMv7l
SHA-256 checksum
How to use checksums
fdfbef042b1262e118f7ff8fed0907b364b5808925e0d821d2b139503ee6e8ca
BLAKE2b-256 checksum
How to use checksums
4706e126a1589d93f196ed53bc57a338a98c57aaca8124fcd9d36d8b4f977cbb
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.6-cp310-cp310-musllinux_1_1_aarch64.whl

Download URL granian-2.8.6-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
1091637b86dc2b6fe72d8c077d9a57915f2982fffaced680315e9437bc4a1bd1
BLAKE2b-256 checksum
How to use checksums
4185a3183431d04345d3ed4be7f267d399079428a9e7f802bfc775cf1cab2a50
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.6-cp310-cp310-manylinux_2_28_aarch64.whl

Download URL granian-2.8.6-cp310-cp310-manylinux_2_28_aarch64.whl
Size 5.0 MB
Tags CPython 3.10 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
3a29c93598334356450b10deb423468364fd91045421a5059c1707033fc9ff49
BLAKE2b-256 checksum
How to use checksums
52a891fb640c23823327b1040544a1080cf4df06c4cca757ff4c1ff527bd31e0
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.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL granian-2.8.6-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
6bd1f43b175e708c651ab364def812ba6eff7e5bebf3ea0248b6652f44d2221a
BLAKE2b-256 checksum
How to use checksums
6473d1f52db30bc321029802311b827975e8b33d24f75793093163b364797dc7
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.6-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl

Download URL granian-2.8.6-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl
Size 4.5 MB
Tags CPython 3.10 Linux glibc 2.17+ x86-32
SHA-256 checksum
How to use checksums
78dc2a6b74387d2bab48383a05222cef04e2c34e3ad5215713d0b9d657ff5baf
BLAKE2b-256 checksum
How to use checksums
3000f34b676aabcee7c8fedae2e12a387c53f4ffde1bd0bafc61c46d351db5b1
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.6-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl

Download URL granian-2.8.6-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
e4503d7fccd2a82afff364846d7618812af381d70183c019e89af4e3c6bba458
BLAKE2b-256 checksum
How to use checksums
b1115259dcd3819e5648a731f3cd2caf187fcb3a0c4a3b5daea77713cb90c9d3
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.6-cp310-cp310-macosx_11_0_arm64.whl

Download URL granian-2.8.6-cp310-cp310-macosx_11_0_arm64.whl
Size 4.2 MB
Tags CPython 3.10 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
d0b55d4ee49df523fb44aca69e04e68e64397cc07ad97aeffaca955f15681aa2
BLAKE2b-256 checksum
How to use checksums
7f9d799586976b4862c5df3bf383ae857e5341890dcb2904cd938d87594dfa6a
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.6-cp310-cp310-macosx_10_12_x86_64.whl

Download URL granian-2.8.6-cp310-cp310-macosx_10_12_x86_64.whl
Size 4.5 MB
Tags CPython 3.10 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
f9502857d7f9bd5df3b9a325bf2cfa1c220577f255e0cf00529128164c808843
BLAKE2b-256 checksum
How to use checksums
34e659eaaca7044560a1290b76ab4bfb8ba2b5e9e639cdf65708be89e5fef78c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Security for granian 2.8.6

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

2.8.6 This release

89 release files No provenance

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