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

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.5
File Size Uploaded Provenance Actions
granian-2.8.5.tar.gz 130.9 kB Without provenance Details for granian-2.8.5.tar.gz

Built distributions (wheels)

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

Total release size: 414.7 MB

Release files / granian-2.8.5.tar.gz

Download URL granian-2.8.5.tar.gz
Size 130.9 kB
Tags Source
SHA-256 checksum
How to use checksums
032588689e2d524d633fcb088ee54fad4c5655d0af1a75058d5b4240be4f6864
BLAKE2b-256 checksum
How to use checksums
e263c2548102956296ee0f8671291dd5a6f3f3dc2fc7c4e62e0b86e3be6de571
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

Download URL granian-2.8.5-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
c6803546881c0a2e4ad21088fabdb8ef0f802c3edf5d1606cbd8b7146b7345bc
BLAKE2b-256 checksum
How to use checksums
b33e60d2c5b2e696fe59b4922bdb96d69661f073c60eb52519790e378593af5a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

Download URL granian-2.8.5-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
a51bc4b6a6c7692037bfa2a55969714318bfb72cab1901280829333be21899e7
BLAKE2b-256 checksum
How to use checksums
d157958e7f82de6947f95b6248c2ec2cc9979858f5f8a2ba0dd98665dfaa4c10
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

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

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

Download URL granian-2.8.5-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
8c052f5399c31eb5b08d6e67232cae69070341acb5e6d19b5aa0b45bed48f6c6
BLAKE2b-256 checksum
How to use checksums
d0232ddcc44baabd39c32714cd3b868a1d27c6ae318a2bfac879a8241a8ac083
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

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

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

Download URL granian-2.8.5-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
41017d36448de63a171c76e9e728bdad0645ca1f8a4b2a62267c61dedf13c19f
BLAKE2b-256 checksum
How to use checksums
4c4b520fe7f10a527b72294e6714370943fcd9d003da7c940c4c9695ca36943a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

Download URL granian-2.8.5-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
1915e09e4eb6cf3d5134633c5302e6525529b929d549a3861df011d4044f3706
BLAKE2b-256 checksum
How to use checksums
dcf1d419875fe9fac243324dbc949e7b3dac63a70a54bb205f56a2d057e18765
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

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

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

Download URL granian-2.8.5-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
1fb135bb48bef82f9dcaef3462c4b49b24a6a423572c65e6b9db4647555b821e
BLAKE2b-256 checksum
How to use checksums
72ba8f76547c8c52eed6ac2fe2b17e749b7fb8bef9bc23dcfd849897bc7ae7b1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

Download URL granian-2.8.5-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
42aa50fcf6798f30bec90f9b5a22d3039be06932423b12ffa80b1ade2328a631
BLAKE2b-256 checksum
How to use checksums
c65c6e1b5d5b498fae263145fe719d053810b38d86d754a92454d15a985274d2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

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

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

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

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

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

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

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

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

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

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

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

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

Download URL granian-2.8.5-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
b18d114a56029d464ff2f782387b906b180177462d9d2254f4f73dda829c4ad3
BLAKE2b-256 checksum
How to use checksums
044324df4c606be4d15dfca92a5ce3ee4b8f4fcf5327519af4d3c403a5b2fe4d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

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

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

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

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

Download URL granian-2.8.5-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
cf3ecf3a3244b9131ce0a847e50fa404b340a99b0904047d993eef0ed4cc5f4f
BLAKE2b-256 checksum
How to use checksums
652ad2faa15f0e8dfce88abaa607946219dad89ace7c0c0654e77157db65ed24
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

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

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

Download URL granian-2.8.5-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
bc75eabd606b76dbe31f2641d006152b27e8f317336faf18eb5ebe68e408b23f
BLAKE2b-256 checksum
How to use checksums
406d842f6ba44ef4c8eb58487de3b80e712c2863e79053272ad6dc6936b4052f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

Download URL granian-2.8.5-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
1eefe87b1d4294e6c5f0876f5f497af6ecca6b1ebd79a4a841cbdc9469981781
BLAKE2b-256 checksum
How to use checksums
d1ae5a2323c84244954ea1f57cff8839b21dc160fc8867595ad02d14047c4e14
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

Download URL granian-2.8.5-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
fc4dd03483d79831d9e67c3490aa4d68e717bbf68b15fd84d75d05413b341764
BLAKE2b-256 checksum
How to use checksums
827e357ae2afd73f26f66afb10d5f56a05964034479202c6dcee0625acf11f0a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

Download URL granian-2.8.5-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
f88a2287bd249e5412c48389eb8ef7abd402e224cae91a991c69038c05168a15
BLAKE2b-256 checksum
How to use checksums
77aa74a3daefc65bae63aa69e83304ebc40b71f0cce697084f57ec08475062b4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

Download URL granian-2.8.5-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Size 5.1 MB
Tags CPython 3.15 Linux glibc 2.17+ ARMv7l
SHA-256 checksum
How to use checksums
4643e7e06e41c5e6fd3f64120351b82f0355cac2fc55753b416d4ccfdcf3b096
BLAKE2b-256 checksum
How to use checksums
3748faebf1a75105cbb80fb5aaf10b0e847b5a3c95be4d1ae418574e0b9f471c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

Download URL granian-2.8.5-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
5efdd2240bfa3c73b28823b600a536435e668c319b563056169dc2ccc8455c00
BLAKE2b-256 checksum
How to use checksums
759230313d9f420871f17937f460356a37161f0749ef4bf00f1e55a206845644
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

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

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

Download URL granian-2.8.5-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
3012b24c51882581c6717f77f907e9ea2e8178a9f5170a4eaabcb1b67a059adf
BLAKE2b-256 checksum
How to use checksums
3d9dc25f5eaa94f5e57238c23686531833bbd5c9dc2896068f8b95f8faf860e8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

Download URL granian-2.8.5-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
6c961cb4b17dc58bafa8a0c02a7be988c81f69fce76b5ecfe20c656fda0ede22
BLAKE2b-256 checksum
How to use checksums
94ffb36c8988e56a2b3e7846fc63e5c93a15408d96786807427533fed87c49e6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

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

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

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

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

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

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

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

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

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

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

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

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

Download URL granian-2.8.5-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
3ab0046f99ccbb39198ecadac6df163ff312886b93630e1ca319a1fafecf6af4
BLAKE2b-256 checksum
How to use checksums
2cff6c86c7cc796c440c383300aaf3c95736e5663a756a8164b4faa6ed0be2a9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

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

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

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

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

Download URL granian-2.8.5-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
2049b3b0d591c754ac89e313f88e8dd35c4aa741193e39f2329eece4e447c04b
BLAKE2b-256 checksum
How to use checksums
d172063abeff9026aa62aa1412b327cb4b75b161dec5744e60b24eba6c98bbd7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

Download URL granian-2.8.5-cp314-cp314-musllinux_1_1_armv7l.whl
Size 5.2 MB
Tags CPython 3.14 Linux musl 1.1+ ARMv7l
SHA-256 checksum
How to use checksums
519d1461c2ea4086ff5643b8abaa78dadc5a3d0f2ab5ac4de1811f9980c3e153
BLAKE2b-256 checksum
How to use checksums
9d68fbeb8760e5854115d0573a998d2239d844f3681781f3d2ab1b732fc05224
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

Download URL granian-2.8.5-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
66f2ebe92dabfd986d99cb911c1027bacb35570119e244918e5beeef56dce1e3
BLAKE2b-256 checksum
How to use checksums
cc194214986ccad3b6791b5b70ee8ee1545af4a12c8650726025280f69854655
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

Download URL granian-2.8.5-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
091fa616adfbd83460433a99df0858ff3e831e937e478d1e8170a0fb71c61431
BLAKE2b-256 checksum
How to use checksums
1fb0863f62924357de8b486f22a7a5b11e7bda2dbebcc44ce2950af210f3d57b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

Download URL granian-2.8.5-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
d8162358380d4b9398a2176779cefe553921fd5e433ccad7fe6d371e0845fe82
BLAKE2b-256 checksum
How to use checksums
c46570d500aaf815be539d2761192b499fc7514a625eb92b1f55c4639db7d75c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

Download URL granian-2.8.5-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
a25ee45ab230a9983c6ba6401b1dbc7b3ee7de48793c52712c8ffb9662baefce
BLAKE2b-256 checksum
How to use checksums
77b41b3c164cdb8c16c130fa483ab15b18c4f068406e901b1bf30725ab2dca3b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

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

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

Download URL granian-2.8.5-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
0ba7323572d6f0b6cc1a86fac8f6bc42d467fe0034c85429252e93b111c79a1f
BLAKE2b-256 checksum
How to use checksums
09095b1e9d5ee47ca8e248ed4d8d41f0290a312c1c2d9415f558ae0106a6691a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

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

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

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

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

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

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

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

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

Download URL granian-2.8.5-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
1be90ad793a14e367c3cc8a21aa82078b4a6e84df95700e3fd76f4207e558b3f
BLAKE2b-256 checksum
How to use checksums
9aca41e56be77bcd77b4bab356302dc6b7755227ab33645185131ae3a40b1331
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

Download URL granian-2.8.5-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
30c85664d3a51397c97413f5c341e7031ea08614c016d9bfb2ee82bbd6029c12
BLAKE2b-256 checksum
How to use checksums
642605d2bb66e8a6c07568a6ae334b7a5e9c674462ddc88cdcb9fc5a14e2b5cf
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

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

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

Download URL granian-2.8.5-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
87eca4dbf606eb4a91f1c01f7cf7517c8290343cc083274a9e6d24d7b20577c1
BLAKE2b-256 checksum
How to use checksums
0d94063998b729003dab2a7a793a3deb4fec23581aa0a51f4a5e492a5fab194b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

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

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

Download URL granian-2.8.5-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
4ea263ab8c64434080269a49dc706a1841f7939ceaf1ddec0f204edbab2d83fc
BLAKE2b-256 checksum
How to use checksums
29d066c795135b0dc79f0a1e14fdbfc9c1d01d88ef7ceafa651185ef6f9d3e87
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

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

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

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

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

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

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

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

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

Download URL granian-2.8.5-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
1c72079469aba9856d4d030b21ff75a5c2d9a201cab930926237ab1646e5596f
BLAKE2b-256 checksum
How to use checksums
593e2c494c6afa6c4ae564c05d0611ce7ee108824812a74bb20e024e752a8f2c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

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

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

Download URL granian-2.8.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 5.1 MB
Tags CPython 3.12 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
66f0de2cb17109da7ca070a2898e4543083914c2c440ba4a134a53cf4ec526be
BLAKE2b-256 checksum
How to use checksums
267e9a4aebcc1fe18d849b79cbf2aded21e8d6023436b98a53b1514955c5470a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

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

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

Download URL granian-2.8.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Size 5.2 MB
Tags CPython 3.12 Linux glibc 2.17+ ARMv7l
SHA-256 checksum
How to use checksums
29a5e1459736acd617631524db3c430df7b7fe2fd55b6f21536eb9d30a603d41
BLAKE2b-256 checksum
How to use checksums
60e3274741428e960bf59b12c51cdca2340698e708f3bab4ec6fa16b0765d12a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

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

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

Download URL granian-2.8.5-cp312-cp312-macosx_10_12_x86_64.whl
Size 4.6 MB
Tags CPython 3.12 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
3404a620364f3816f126863910e6dc86da833298608896e556c01c9bf52a63c2
BLAKE2b-256 checksum
How to use checksums
2791103c04ea8ef7d9d40cdecb96a07cae09bfe9e3857d39b8174fc5c1a771fd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

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

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

Download URL granian-2.8.5-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
06fa5fbbe2b1dcc66a3384bbe1d156730ff0d6128173f9fa35b999d9b6eca500
BLAKE2b-256 checksum
How to use checksums
110c009b9fc714dfb4d0402b8ed36bad04a2567d4b77cbba56712549550a335d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

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

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

Download URL granian-2.8.5-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
d9438061a319f5f621ba9c963baa760f62f907d95c21cdf10cda6434e75879f5
BLAKE2b-256 checksum
How to use checksums
57675151a391bc39fb2628e995332480e7efa5d83db69b499cb0aaac6832cf55
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

Download URL granian-2.8.5-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
d733a133b381abfd4ab5035346071c81480e9ff2abedcb4375f10ce1c7c68794
BLAKE2b-256 checksum
How to use checksums
5089a5883d04b5dad8f01fcb66803cadcf6fe900d1150cd715f5b08742e2e952
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

Download URL granian-2.8.5-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
85fcdbdf012cdea0eb628b2858dac2e9137272c72d16b52d25b3cf014450f8c8
BLAKE2b-256 checksum
How to use checksums
21090a59603a3733ab46bef1df03538813de11a510bfd97a324d5072c8370563
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

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

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

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

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

Download URL granian-2.8.5-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
6dac7fe7e8263000f74387e07e3a178279d971039bd2b6d029129798ef9e2f59
BLAKE2b-256 checksum
How to use checksums
760d731274bc814123f0ad1fac977202b65d2a703819a0b37c54315a4b7b78cd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

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

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

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

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

Download URL granian-2.8.5-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
e531e9c22e527c9c8cfbf188fc446269011bb15370ec033b4f3b6decd52e215f
BLAKE2b-256 checksum
How to use checksums
fc086241869f4dcf7fed403331803fe0851b73b04da17f00bb18f461d4b39193
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

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

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

Download URL granian-2.8.5-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
55b19896b5ddfff20a48bc07314d3f1136a04401e9e1b2a13dc5e35797f77f1a
BLAKE2b-256 checksum
How to use checksums
999240cf612d8ca16434ba3370a9a093d5a4d5040b52c0232ca960b0a719899b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

Download URL granian-2.8.5-cp310-cp310-manylinux_2_28_aarch64.whl
Size 5.1 MB
Tags CPython 3.10 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
62f0d98695efa53b0f90ae211eff7c485009777378ad33af1ba46421173c239a
BLAKE2b-256 checksum
How to use checksums
29e1656503580d5ca6f12872cd53ee452f9f222fb7a65468aaa39d7e3bad1602
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

Download URL granian-2.8.5-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
46c54bc18a182cd57319076ef96d89c3be13605aaeafda1ecad999bd0449d201
BLAKE2b-256 checksum
How to use checksums
46bf7e6a90f84363700f18e347be11edf642bc2ac8c839bc965b683a62abffb8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

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

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

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

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

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

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

Download URL granian-2.8.5-cp310-cp310-macosx_10_12_x86_64.whl
Size 4.6 MB
Tags CPython 3.10 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
98f09b0539e9dcce6ee534232b2d933ba97f27173675ef5a177d01380aa76371
BLAKE2b-256 checksum
How to use checksums
9b8271f4ecf6fbe2eb7f9f32c2b73527c52ad1213d8d765876cf4a2175caa2eb
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.5

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