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

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.8
File Size Uploaded Provenance Actions
granian-2.8.8.tar.gz 131.5 kB Without provenance Details for granian-2.8.8.tar.gz

Built distributions (wheels)

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

Total release size: 429.0 MB

Release files / granian-2.8.8.tar.gz

Download URL granian-2.8.8.tar.gz
Size 131.5 kB
Tags Source
SHA-256 checksum
How to use checksums
ba0f19ef2337bd2456795077d861d98f7d841d16a527033ee98c4dc4717f35f0
BLAKE2b-256 checksum
How to use checksums
5808ff9645a0acd0024b4d99df9f0a2bdfb48d152ef8bcc1e092344c531e1840
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-pp311-pypy311_pp73-win_amd64.whl
Size 3.4 MB
Tags PyPy 3.11 PyPy 3.11 7.3 Windows x86-64
SHA-256 checksum
How to use checksums
19d7beab602b9f8f78a72a06a05e207591b5c6d2f6f350a346a12c7d1697c2f5
BLAKE2b-256 checksum
How to use checksums
97692990deb1b44d1bad2c3c9e386bb22e4513b93478eb07868794e28bdba34c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl
Size 5.4 MB
Tags Linux musl 1.1+ x86-64 PyPy 3.11 PyPy 3.11 7.3
SHA-256 checksum
How to use checksums
a49e339fcf9e6412bc4080da9179b89952e76afca0f967462b78b1da35593459
BLAKE2b-256 checksum
How to use checksums
2a811fd8e268177187ba564f2dd09386c4cf241c66ace18b86f9fcf8d5e74535
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-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
804bffe530929c0593e641e3de98d930d9f055ebc7b318c719fac431b64f2a30
BLAKE2b-256 checksum
How to use checksums
4965e5c5d538bef9bb5c0cb9310dc0ddc5d8a542e0aad58d8ebe1a2e7422202b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl
Size 5.4 MB
Tags Linux musl 1.1+ ARM64 PyPy 3.11 PyPy 3.11 7.3
SHA-256 checksum
How to use checksums
1932238e80feee132ea37d6b654493287fffa6119426cd1ce60b1c832dc7348d
BLAKE2b-256 checksum
How to use checksums
4975cde3d230e34853155b834a26a1a60fd54b21a63301a58f078578b1049a3f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

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

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

Download URL granian-2.8.8-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Size 5.3 MB
Tags Linux glibc 2.17+ x86-64 PyPy 3.11 PyPy 3.11 7.3
SHA-256 checksum
How to use checksums
07348dcf7813022bb4e67d079db9f7bf64513530e12d2795e0bab1df7f6e071b
BLAKE2b-256 checksum
How to use checksums
c0b3241df05778bfb5c87a76ce74c90f5194fac7d5d0b2123a76fad4c2259d20
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

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

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

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

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

Download URL granian-2.8.8-cp315-cp315t-win_amd64.whl
Size 3.3 MB
Tags CPython 3.15 CPython 3.15 free-threading Windows x86-64
SHA-256 checksum
How to use checksums
a9b4203cb1cf22ac95c10d67e6b5dd87075918b7faf22ade1065a7e7e7584949
BLAKE2b-256 checksum
How to use checksums
d7dca0d79bf31947747ba14669c92e766cc213a8be33bbcd4c30b6a6d4060b8a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp315-cp315t-musllinux_1_1_x86_64.whl
Size 5.4 MB
Tags CPython 3.15 CPython 3.15 free-threading Linux musl 1.1+ x86-64
SHA-256 checksum
How to use checksums
dfe7e768e2e41d1f2d4480c65c4ce0c910171f7a48eba07990b8fc9502211503
BLAKE2b-256 checksum
How to use checksums
63323c7bc673240ba682ec5332c297b9ef9294341f2184e14266d9e0b785e45c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp315-cp315t-musllinux_1_1_armv7l.whl
Size 5.2 MB
Tags CPython 3.15 CPython 3.15 free-threading Linux musl 1.1+ ARMv7l
SHA-256 checksum
How to use checksums
6f37536041a695c3b4d95ca73bcf8fff2b9feef438819b9fb269cbfb16f6ed58
BLAKE2b-256 checksum
How to use checksums
12c866f92f7cd3fd40e3a6d4a8c963c67c2f2e5113dbd4f185957951560c149a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp315-cp315t-musllinux_1_1_aarch64.whl
Size 5.3 MB
Tags CPython 3.15 CPython 3.15 free-threading Linux musl 1.1+ ARM64
SHA-256 checksum
How to use checksums
4cb2f8c96713d3de425687c4a303641118122dea78ef78b87e07fe07c4fad8d7
BLAKE2b-256 checksum
How to use checksums
e03a9760faf69829218783f9052900c9f9834a41f00baf7f03d79bbb7aa896f4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp315-cp315t-manylinux_2_28_aarch64.whl
Size 5.1 MB
Tags CPython 3.15 CPython 3.15 free-threading Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
08be2f1ada6095e060ef3d71a880b5f0379c1d2b47bf935fa18195da4bdfd065
BLAKE2b-256 checksum
How to use checksums
27bd820e6ba18a9e87a23e236f9d76069f0bbed7a8d688f4830d4df8db823003
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Size 5.1 MB
Tags CPython 3.15 CPython 3.15 free-threading Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
508377a0eafe20d547608d170d3973aac839318cc72b5fe48db7dd6e34aa6fbc
BLAKE2b-256 checksum
How to use checksums
49f2cac02f27e73976f33806cb8f88d67ddbbd7122ea0de72febbc2059a97d2f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp315-cp315t-manylinux2014_armv7l.manylinux_2_17_armv7l.whl
Size 5.1 MB
Tags CPython 3.15 CPython 3.15 free-threading Linux glibc 2.17+ ARMv7l
SHA-256 checksum
How to use checksums
45649e53deee67d723c68e6de6a89e35b788b9c0ab85670e0c4b7ecddcca8b3b
BLAKE2b-256 checksum
How to use checksums
5d73c08b08b6f01730ca0922849333f5ae81bc9d2669ac4953e576822ac5b91e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp315-cp315t-manylinux2010_i686.manylinux_2_12_i686.whl
Size 4.5 MB
Tags CPython 3.15 CPython 3.15 free-threading Linux glibc 2.12+ x86-32
SHA-256 checksum
How to use checksums
cb7236f42ae4fae8be8f8a9f34b4a1ac60df1b0d6ab45fd278fbed3345977e03
BLAKE2b-256 checksum
How to use checksums
9f34be0d28cc095d8642b508b27406b978efa6b03462d2d08e32638c79d6eb5f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp315-cp315t-macosx_11_0_arm64.whl
Size 4.4 MB
Tags CPython 3.15 CPython 3.15 free-threading macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
6d5355341b5afa5abc833ad70d300b91abd66e23166cd8f01330165ece49be67
BLAKE2b-256 checksum
How to use checksums
640e04546e1685e59d0c9e2c4248b364370882927065eb6b6c0c0fe7deb7169b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp315-cp315t-macosx_10_12_x86_64.whl
Size 4.7 MB
Tags CPython 3.15 CPython 3.15 free-threading macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
157b0319ab168381a1e6d0396211f3b01e2996a76c4ab358411d35eef6122d07
BLAKE2b-256 checksum
How to use checksums
11ce4388b8183758992e99251104a58c855690bf8c894274956b1dcf7b00151a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp315-cp315-win_amd64.whl
Size 3.3 MB
Tags CPython 3.15 Windows x86-64
SHA-256 checksum
How to use checksums
bb6b74e3d531a18f824b45653544c15641b9492a44434d0ae451ed009901646f
BLAKE2b-256 checksum
How to use checksums
40ec0f202020fd1ba51bd5777fc8e7bdb52aaacfb94c58f2a24a33dbf132ebc8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp315-cp315-musllinux_1_1_x86_64.whl
Size 5.4 MB
Tags CPython 3.15 Linux musl 1.1+ x86-64
SHA-256 checksum
How to use checksums
d05127c503c09b774b08c3835e1a4b17e280135432b08236d299140955f1575b
BLAKE2b-256 checksum
How to use checksums
4b9882511e33c3ce48c6ec293e819f19ad4eec4e08ee8cfb2a3f6e498b4321bd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

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

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

Download URL granian-2.8.8-cp315-cp315-musllinux_1_1_aarch64.whl
Size 5.3 MB
Tags CPython 3.15 Linux musl 1.1+ ARM64
SHA-256 checksum
How to use checksums
9da36711f816f320da38033a9cbdb97405cf8d5a69384029c8da42e367f214fd
BLAKE2b-256 checksum
How to use checksums
bf79865f8306ea3e18459c02dd3bb9caa98d2ee6b55594ba5616ec30efc4fda4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp315-cp315-manylinux_2_28_aarch64.whl
Size 5.3 MB
Tags CPython 3.15 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
83693da43bf6682cc0fbf3da2cd64c369602615c235dd8e0ae7d6d7cbe555c97
BLAKE2b-256 checksum
How to use checksums
b30ed117631d54bd38f2397ddc32c5376bda0e09c62e529a0f64c74173ab95ed
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Size 5.3 MB
Tags CPython 3.15 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
10ecc0023424f6cb6158990d2e448a45a618f7abee476addb1b454f5e426a53e
BLAKE2b-256 checksum
How to use checksums
6b71b9521abb8cd3a79c90bee996359d2b5fe2285f83bbd2e7c84b20dddcb9cb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

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

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

Download URL granian-2.8.8-cp315-cp315-manylinux2014_armv7l.manylinux_2_17_armv7l.whl
Size 5.2 MB
Tags CPython 3.15 Linux glibc 2.17+ ARMv7l
SHA-256 checksum
How to use checksums
b7d4dabf3b41f670dcfc63f49cff3ad617c5c915b82d16d1559a97ca60af5a03
BLAKE2b-256 checksum
How to use checksums
34e9b83e836c2ec672a010cd34f09a077671dae810daa820410576ed9bd8b527
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp315-cp315-macosx_11_0_arm64.whl
Size 4.5 MB
Tags CPython 3.15 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
e37387574207a424077649e2faca8a2e2eb1d480562dc88a28a5a15ab95cb55d
BLAKE2b-256 checksum
How to use checksums
771a52bad3c6036db698722a1e9d55ed2543482db88fb24f9f3b598ad07497ae
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp315-cp315-macosx_10_12_x86_64.whl
Size 4.8 MB
Tags CPython 3.15 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
697f670a2cadcaa1534747ab3d3860a6ba1a61f9d05d1895ebb782687489ac5a
BLAKE2b-256 checksum
How to use checksums
d68a7a5e14306848180e470ee6cd90a23ecbb55af19442ed211cf3e93e9a9a7b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp314-cp314t-win_amd64.whl
Size 3.3 MB
Tags CPython 3.14 CPython 3.14 free-threading Windows x86-64
SHA-256 checksum
How to use checksums
529f1b66134f5bb03e8840496e2e20cc9253fb0b9d8a5ba8925a2d96e7a7237e
BLAKE2b-256 checksum
How to use checksums
79ccf30160b42cd07a8d107cdbbf18671e862ecd5393bf43c5b533a944888c0b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp314-cp314t-musllinux_1_1_x86_64.whl
Size 5.4 MB
Tags CPython 3.14 CPython 3.14 free-threading Linux musl 1.1+ x86-64
SHA-256 checksum
How to use checksums
fd96761e26a937a2ed76ec3de7a1717e74c2959df70507eeb467bd1e477e3454
BLAKE2b-256 checksum
How to use checksums
c74ac01024cdb0e9efba36d6df575bf1dc88a9246abc915ab2a7c8dba6c512ad
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

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

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

Download URL granian-2.8.8-cp314-cp314t-musllinux_1_1_aarch64.whl
Size 5.3 MB
Tags CPython 3.14 CPython 3.14 free-threading Linux musl 1.1+ ARM64
SHA-256 checksum
How to use checksums
ac0f059785cb6ede6e4207fb1fda7d92065e041c9c5decaaacde9b42cb6ea0c4
BLAKE2b-256 checksum
How to use checksums
bd1e70b66776bfc597dd52aaa095ec00c86d726d332a630ee7272d4bae9796b7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp314-cp314t-manylinux_2_28_aarch64.whl
Size 5.1 MB
Tags CPython 3.14 CPython 3.14 free-threading Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
87f87a78d635f8964fd201a2d12a5cccd050fa3cb7a9b18b2978c90143e951ed
BLAKE2b-256 checksum
How to use checksums
351cb36ce23ce840cf5a87565efd937062736a6c4ac13a592e770aa9219210cb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Size 5.1 MB
Tags CPython 3.14 CPython 3.14 free-threading Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
561e88ff5c0c826798632dbf95c36c61822f66d0eea92bd27dc057502ac1a0eb
BLAKE2b-256 checksum
How to use checksums
8e84624203f78123f8106d8055c66978f1b4c8a06a9d6b4f05363d2397e5420e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.whl
Size 5.1 MB
Tags CPython 3.14 CPython 3.14 free-threading Linux glibc 2.17+ ARMv7l
SHA-256 checksum
How to use checksums
d118003cf21b1691acd9840e8e5dca6c6e4bbe009c21ee4fd69eca9d71a51c5d
BLAKE2b-256 checksum
How to use checksums
0b1de893fb7c3b87a3468d8fb03ac43afba35d94a02d59dcbe83138d59852035
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp314-cp314t-manylinux2010_i686.manylinux_2_12_i686.whl
Size 4.5 MB
Tags CPython 3.14 CPython 3.14 free-threading Linux glibc 2.12+ x86-32
SHA-256 checksum
How to use checksums
c0c923aeec3570d850b6f702e0fad8382d4720a93f126bed9bebd93d72c5101b
BLAKE2b-256 checksum
How to use checksums
31994e1386edbee72ae0a13af21a853b1a6b6ebda209348135abaf550bbb9c5a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp314-cp314t-macosx_11_0_arm64.whl
Size 4.4 MB
Tags CPython 3.14 CPython 3.14 free-threading macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
21d5525497308ce041cafde5403c48f6421fda78feb12c738e9b0c89f7528854
BLAKE2b-256 checksum
How to use checksums
4a16b637562cd482bad38478aa223a0486d16712e755a0f417673716fdf0e7be
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp314-cp314t-macosx_10_12_x86_64.whl
Size 4.7 MB
Tags CPython 3.14 CPython 3.14 free-threading macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
f29542839b962325dc71338fea04d2e04997e4b8e1f96a5c836a621ee246bb8b
BLAKE2b-256 checksum
How to use checksums
859e72556c85c24b43b5717824f70328cb1176babe53500d8badf130d5bcf91e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp314-cp314-win_amd64.whl
Size 3.3 MB
Tags CPython 3.14 Windows x86-64
SHA-256 checksum
How to use checksums
ac093a1f2fb27bf13e4ddc8497d5467e10ac61003eeceed92f2714faa9241370
BLAKE2b-256 checksum
How to use checksums
4af8f744feff6180305d4c9aa7997456191cf39b156d6e74d3b2cd67b9d71b01
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp314-cp314-musllinux_1_1_x86_64.whl
Size 5.4 MB
Tags CPython 3.14 Linux musl 1.1+ x86-64
SHA-256 checksum
How to use checksums
c1e30cb484edcb661a43a92d2534a3aff1a647f50f0202e62d13be3f19531350
BLAKE2b-256 checksum
How to use checksums
62ad901c69f931239f96f6614512a825371cb8ba54423403728f7b7d6d37fc5f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

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

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

Download URL granian-2.8.8-cp314-cp314-musllinux_1_1_aarch64.whl
Size 5.3 MB
Tags CPython 3.14 Linux musl 1.1+ ARM64
SHA-256 checksum
How to use checksums
e783ff71123541471d7ebd1d362d959e3e81ea4e212921def62d9f52ab4a4f7a
BLAKE2b-256 checksum
How to use checksums
b18cd6637482ce228a79544d87f71f1de15cce3e597d61c8510d67c58257b146
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp314-cp314-manylinux_2_28_aarch64.whl
Size 5.3 MB
Tags CPython 3.14 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
ee9b1e164da2c90aaa2f1d14ab74c3eb46ecb68fabe731fc17e339cf57c1434f
BLAKE2b-256 checksum
How to use checksums
11e092ad5ded9e976018f2ebca0557e850e66d54f93ac80d358da05cb67dc7f0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Size 5.3 MB
Tags CPython 3.14 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
f35d65aeb77678b95df5ba1be79f7e7cf127d1b929e9a3accefbca63a5ea5a9d
BLAKE2b-256 checksum
How to use checksums
8dfe85b2047b8490f2f06f929dd845c8f6d651dda7533f5919ac0a6bc7580311
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl
Size 4.7 MB
Tags CPython 3.14 Linux glibc 2.17+ x86-32
SHA-256 checksum
How to use checksums
a04f2461f311afede886c8a3cbeb667ea4a1888a30cc48867b3e8f8657fb4836
BLAKE2b-256 checksum
How to use checksums
584b47afb9d792af3dbf2878ba4afbe5c73ea870a98be058d34a5f6b3d399417
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.whl
Size 5.2 MB
Tags CPython 3.14 Linux glibc 2.17+ ARMv7l
SHA-256 checksum
How to use checksums
1dc2f2685bcf190d2523a8d1618ab48c048fe150276639c4841cd7405b0a797f
BLAKE2b-256 checksum
How to use checksums
6ca0b936531f9699f914b37b45f11e29e4252b43ccf00fd6866452f77bc8691e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp314-cp314-macosx_11_0_arm64.whl
Size 4.5 MB
Tags CPython 3.14 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
249f4de88ae3f6d23e481dc89fd95e99339240323ffef95c116a9218e923ae47
BLAKE2b-256 checksum
How to use checksums
f2021f76d4b344b064d2dd5202abc2b557e3c8fb4eac16744bc73f58aa72e6c7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp314-cp314-macosx_10_12_x86_64.whl
Size 4.8 MB
Tags CPython 3.14 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
144fd59f8a80a50a9fded071e8a162e19e01e9e7aa19426f703a1bba17dd0d90
BLAKE2b-256 checksum
How to use checksums
6fd8b9e6a3dcf729e713b8f82579d52709ef633d82a802a3e443a382ee40b49f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp313-cp313-win_amd64.whl
Size 3.4 MB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
09c5f6a2264dcbfecdb3a80f6091b064a98e4cc775b0a36a1cd90f64821462c4
BLAKE2b-256 checksum
How to use checksums
aae5093f520c684b0738f870b698932420e61126a4aa02d64e81e086a3cb8789
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp313-cp313-musllinux_1_1_x86_64.whl
Size 5.4 MB
Tags CPython 3.13 Linux musl 1.1+ x86-64
SHA-256 checksum
How to use checksums
3757fac245bfbbe26b12b2d9ed09e0d71a16a8ea90d5d34b7611e2b06d5f38ff
BLAKE2b-256 checksum
How to use checksums
289f34ac6fb84eba3e2665305a67f7c8d0ff2166d473f71b288e2f69d7e87a02
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-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
13c2ee0019f4ea2622f7e997fb1b6d7191c50f6bb664300dd44885f6f7470863
BLAKE2b-256 checksum
How to use checksums
b7efd396282eaca77d8c227d48dfac95e3e013fec6a45d89e7b8a03a1358f287
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp313-cp313-musllinux_1_1_aarch64.whl
Size 5.3 MB
Tags CPython 3.13 Linux musl 1.1+ ARM64
SHA-256 checksum
How to use checksums
c282c9ff0b7baf087240fe034e52abb7b1334e5fbd445faaaec8e6c7bfd5b99f
BLAKE2b-256 checksum
How to use checksums
969d3a596406492a0cc9751acf5250422cd3e7a6e88a3b11b8860403f26657b1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

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

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

Download URL granian-2.8.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Size 5.3 MB
Tags CPython 3.13 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
7d5590870615b88e4e7b824295a1974434892b8a1cd760ebc4b3372fbd3b0874
BLAKE2b-256 checksum
How to use checksums
a618e8a082fe0c010a6f58550f36772d2d907331b5153ab46cca384ccc72f463
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl
Size 4.7 MB
Tags CPython 3.13 Linux glibc 2.17+ x86-32
SHA-256 checksum
How to use checksums
d0a38015eb6b27831c79c212a1ab938854bb33acb40e4cb9aff31dedff09de6b
BLAKE2b-256 checksum
How to use checksums
9ff46ef93da185b5580d535f731d5513215dfb6f64b9990b18b82337aed65660
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.whl
Size 5.2 MB
Tags CPython 3.13 Linux glibc 2.17+ ARMv7l
SHA-256 checksum
How to use checksums
8c6ec1c9eb668c4dfd8849c85bc4d01eb1a68487dbb38870ab74234e3151cffb
BLAKE2b-256 checksum
How to use checksums
d355f0f9fa20c82e512f69a9d05cc3d09a063247ff29d322515fec1c6bfa5c2b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp313-cp313-macosx_11_0_arm64.whl
Size 4.5 MB
Tags CPython 3.13 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
869687a1729416fd7a91ae04796e791fde890ceff598c5e08d7fb756faaf952b
BLAKE2b-256 checksum
How to use checksums
bc781e81c87c404e7b435ebbe7255f010c3819f21789cb5e8a35c9b98f3aec1c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp313-cp313-macosx_10_12_x86_64.whl
Size 4.8 MB
Tags CPython 3.13 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
e354a6c97bd40c746a5b707f607b09aba551ec8b3b05d5332eb4830af367c028
BLAKE2b-256 checksum
How to use checksums
74998d1a15da4d9ba52cfaad67f7771151f2ce1b17741bd86891dc00b989a87b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp312-cp312-win_amd64.whl
Size 3.3 MB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
3349f7ddcf15f0fe4b57790b171bd0b9b6be5e06fc0e9031b57b4a0cc325f91a
BLAKE2b-256 checksum
How to use checksums
ad95f7fd9c3e96ec28fe3a1374b74be1bfe4110a575b7f1b0348ce4072bfd663
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp312-cp312-musllinux_1_1_x86_64.whl
Size 5.4 MB
Tags CPython 3.12 Linux musl 1.1+ x86-64
SHA-256 checksum
How to use checksums
9c6cf41b8d5023148bfe491de4826d5563094f82cc96fac791eb85e6fa242c72
BLAKE2b-256 checksum
How to use checksums
fc3f605d7b97e7a038601a346bf9d915adffbed4d0a20967bf7929b838600298
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

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

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

Download URL granian-2.8.8-cp312-cp312-musllinux_1_1_aarch64.whl
Size 5.3 MB
Tags CPython 3.12 Linux musl 1.1+ ARM64
SHA-256 checksum
How to use checksums
b71a16320929a345d429eb7bc84dc834fb66d9ae8ba445a5e9cfa42577b0756c
BLAKE2b-256 checksum
How to use checksums
40cd6dd96019ac522f549016881f43c8d7a1b4fe815b05fc0f8fe695f666a58d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp312-cp312-manylinux_2_28_aarch64.whl
Size 5.3 MB
Tags CPython 3.12 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
4f6e1400cc0a9976072a8dd755769583e279c5e500005a94d9a955576c492330
BLAKE2b-256 checksum
How to use checksums
68c41d6610f68f79d8d0b277c4f84189b38b079c0e51cfc69d67a5df3b2c87d3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Size 5.3 MB
Tags CPython 3.12 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
0993ee477deaec3c597556813c160b990583cc2079c39d323b29ceaa2727e42c
BLAKE2b-256 checksum
How to use checksums
48f09de92b5eab5548db4fe02c1160b4ed89c9604bc47706929e593260c6d38d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

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

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

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

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

Download URL granian-2.8.8-cp312-cp312-macosx_11_0_arm64.whl
Size 4.5 MB
Tags CPython 3.12 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
b86934ee573c6f5ab5233fe4a1223ae10a0d34f7dba74518111c78e560386b1f
BLAKE2b-256 checksum
How to use checksums
8d28f95731037018b512e301024b0ccfb9eeebb79f8e477dcfd2ab6462b84007
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp312-cp312-macosx_10_12_x86_64.whl
Size 4.7 MB
Tags CPython 3.12 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
0df71dd3593f2562e988684edb2bf19d651441806336cc498c88fd2baecb67a2
BLAKE2b-256 checksum
How to use checksums
04e201e127e7255c4c3f26e419ff82d127294faa024a3e5a95557ecdf215af36
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp311-cp311-win_amd64.whl
Size 3.3 MB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
157f878003aaf768daa3f4747ac83930d0bb3611e8befe8c05abe7443b21e315
BLAKE2b-256 checksum
How to use checksums
8444a425bceb5b358d9d4770dc3d0f9dbe2e2a188b9be8d11f6f376b2db1a3c0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp311-cp311-musllinux_1_1_x86_64.whl
Size 5.4 MB
Tags CPython 3.11 Linux musl 1.1+ x86-64
SHA-256 checksum
How to use checksums
2f813cb7b3e6b1743abc093151f67e680b2a627ce2f4a22b125857ebb0e58d40
BLAKE2b-256 checksum
How to use checksums
887d69eb6b1851d2950ee4e35342092fa4afc76f25900d7a7389f5bbba7dc449
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

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

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

Download URL granian-2.8.8-cp311-cp311-musllinux_1_1_aarch64.whl
Size 5.3 MB
Tags CPython 3.11 Linux musl 1.1+ ARM64
SHA-256 checksum
How to use checksums
d45efa5e8d73eabc021c0b1ca0489d389737ef639e0ce0887e1d310d16d54b8b
BLAKE2b-256 checksum
How to use checksums
71a4eb7ec37790301e388de80aa20088ab35e1f122ee2e787cac55e2b9c04964
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp311-cp311-manylinux_2_28_aarch64.whl
Size 5.3 MB
Tags CPython 3.11 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
75ccb904bd8d444848a50988c50b06de1973ef9b3738f5e2054f9b5890958b0d
BLAKE2b-256 checksum
How to use checksums
a36ddb640920ae9d035a8418338ee00db0b13abb95619261e3efa743b89902a6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

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

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

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

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

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

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

Download URL granian-2.8.8-cp311-cp311-macosx_11_0_arm64.whl
Size 4.5 MB
Tags CPython 3.11 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
22819b3754891e36b137020cfdde937fde943cb2b095482517468376ddcffc08
BLAKE2b-256 checksum
How to use checksums
a76595cf30e2114bdba5af6dfc4aeeeb871e7ec89a98087ad96220a390b41a40
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp311-cp311-macosx_10_12_x86_64.whl
Size 4.8 MB
Tags CPython 3.11 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
ec91357dbcb3bbb982fd467378fb0c259411eb286e88620673f3982e884dda9c
BLAKE2b-256 checksum
How to use checksums
169770b1cf59a40e31c31613936b23b0ccf991f4b3e6ebf29c86f09290eb91e5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp310-cp310-win_amd64.whl
Size 3.3 MB
Tags CPython 3.10 Windows x86-64
SHA-256 checksum
How to use checksums
36df9a2891e3fe301570d595ecd088b9c92d51a60703c472988cdf53212a92c5
BLAKE2b-256 checksum
How to use checksums
b303c6f2fab79aa3388ae9fc54a1a97b1a0b04a1776c0bf0525dbf3f6ea8b606
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp310-cp310-musllinux_1_1_x86_64.whl
Size 5.4 MB
Tags CPython 3.10 Linux musl 1.1+ x86-64
SHA-256 checksum
How to use checksums
fcd49dff8cb949e8d9d5f5e8110e2afcc15c4850a01d5f590c7dd222d4e461e7
BLAKE2b-256 checksum
How to use checksums
d92adf27a9b3828642822b9f2e2756daeb1a7e1939d3ec18de75ffd0c4bfc2d1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp310-cp310-musllinux_1_1_armv7l.whl
Size 5.2 MB
Tags CPython 3.10 Linux musl 1.1+ ARMv7l
SHA-256 checksum
How to use checksums
0a3810dc580afe97190be2fcf3f90e8fff3061ae0067d921ded41a827d18ff49
BLAKE2b-256 checksum
How to use checksums
5e89587a8f425d92bd9d17e68daaa8b7dea7389c92cf996d07ae92ae55e6382d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp310-cp310-musllinux_1_1_aarch64.whl
Size 5.3 MB
Tags CPython 3.10 Linux musl 1.1+ ARM64
SHA-256 checksum
How to use checksums
d154f197650959d1e32b8811709ca009fa6ece08361dcffcd28d43e348487a5a
BLAKE2b-256 checksum
How to use checksums
ae2c938d0589450b17837ac1519ee93da7411cce45fd47abd80207c98d815381
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp310-cp310-manylinux_2_28_aarch64.whl
Size 5.3 MB
Tags CPython 3.10 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
c3e8a681edb84f24ba2897af701aca5421746d02099591c6a1b95250bec7f180
BLAKE2b-256 checksum
How to use checksums
45f27b5363e7baae73abbde0d3a798f86b8c40c249958026b57b0a7836059560
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Size 5.3 MB
Tags CPython 3.10 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
4537864050abd0312e91eeca38d4402b64d8543ea06ea51191e9d3350432b2ff
BLAKE2b-256 checksum
How to use checksums
2301c5238ffb4c973a5388fcaf1fcf111a05ff3cb0b1b43c2f71979977dd8339
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl
Size 4.7 MB
Tags CPython 3.10 Linux glibc 2.17+ x86-32
SHA-256 checksum
How to use checksums
0de844e57f875476e7397bd0702014fcdf6b0206f8829d18f0f1ae05704f4f4d
BLAKE2b-256 checksum
How to use checksums
31643298d2475d26de298439d368091117f4695ad6628233ede8a67f5760094a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

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

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

Download URL granian-2.8.8-cp310-cp310-macosx_11_0_arm64.whl
Size 4.4 MB
Tags CPython 3.10 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
41f1257dad91304f4755f74b325df141cc1abe9a42bb99c41790552be86cf026
BLAKE2b-256 checksum
How to use checksums
98853849eb14253830ac7c41ad88c8d2cdacbf054f334b3d3c4577a582f99e19
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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

Download URL granian-2.8.8-cp310-cp310-macosx_10_12_x86_64.whl
Size 4.7 MB
Tags CPython 3.10 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
ef4518293638cd78cfee902f73bef300c0c4beb17bc5feb3161ad8cdb7dfcdb6
BLAKE2b-256 checksum
How to use checksums
d8b5762a2dcd513d898aa6392d03aa500a098a8140202da00ded6e59b6ef9b2a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Security for granian 2.8.8

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