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

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

Built distributions (wheels)

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

Total release size: 410.5 MB

Release files / granian-2.8.7.tar.gz

Download URL granian-2.8.7.tar.gz
Size 131.2 kB
Tags Source
SHA-256 checksum
How to use checksums
7e63163766d987156d96e1390ee7886950c6a532bbfd5aaf81c653651779446c
BLAKE2b-256 checksum
How to use checksums
19ec1c04eea4290a7e8ebcdc115a629068978e8555b64fd74e98b6710d3af361
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Download URL granian-2.8.7-cp314-cp314t-musllinux_1_1_aarch64.whl
Size 5.0 MB
Tags CPython 3.14 CPython 3.14 free-threading Linux musl 1.1+ ARM64
SHA-256 checksum
How to use checksums
0fcce9ef5e82a416f5f5f3d6baf24e20e51b38580a034e0f26444bc0c45852f2
BLAKE2b-256 checksum
How to use checksums
8ec9b0c65e9eab6568348d11239fbab0b8806eae768a029db66365e1650f9b15
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

Download URL granian-2.8.7-cp314-cp314t-manylinux_2_28_aarch64.whl
Size 4.8 MB
Tags CPython 3.14 CPython 3.14 free-threading Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
04ce1b653b6b9b2dcdc54b4fc2b90d13d9cfd93db753a691a4b1f3e691df82ce
BLAKE2b-256 checksum
How to use checksums
5175482195b021fd349d1ff979b1552ff4ce653ecf40dad04758088789a54198
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Download URL granian-2.8.7-cp313-cp313-musllinux_1_1_aarch64.whl
Size 5.1 MB
Tags CPython 3.13 Linux musl 1.1+ ARM64
SHA-256 checksum
How to use checksums
66439d2ff3d91b35044ca1fc19a082c6a6445381913118b350884c7fadb13be0
BLAKE2b-256 checksum
How to use checksums
4a42d6d36e87f8e03f7b99d8a4a384ab3ecfaf5b5d515e8041fc7d164a73dc96
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Download URL granian-2.8.7-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Size 5.0 MB
Tags CPython 3.12 Linux glibc 2.17+ ARMv7l
SHA-256 checksum
How to use checksums
46dea78905a0d9b781758aeb36b05b940f9e671f30d09e2a906ffe424e348043
BLAKE2b-256 checksum
How to use checksums
3879c119db43862408ba94ebb87d160b38a7e3fc903a8fbba518d04fdd684cb8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

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

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

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

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

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

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

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

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

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

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

Download URL granian-2.8.7-cp311-cp311-musllinux_1_1_aarch64.whl
Size 5.1 MB
Tags CPython 3.11 Linux musl 1.1+ ARM64
SHA-256 checksum
How to use checksums
0a2503a6b2e10748f64bcbcb30b40c323827437fb14a75e8e98c944a62ce508f
BLAKE2b-256 checksum
How to use checksums
eb3ced6f7f1f435560500a3682352be75ed92891c2d701d496f96655760886ee
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Download URL granian-2.8.7-cp310-cp310-musllinux_1_1_aarch64.whl
Size 5.1 MB
Tags CPython 3.10 Linux musl 1.1+ ARM64
SHA-256 checksum
How to use checksums
7e61cabcffa957e352e056858ce0c352e3c1788299659176ff40f187df68897c
BLAKE2b-256 checksum
How to use checksums
37a17746cd1ad51fb65f20556ac82e0dc9e1cb90972e4b8c4f3cffff9f38377e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

Download URL granian-2.8.7-cp310-cp310-manylinux_2_28_aarch64.whl
Size 5.0 MB
Tags CPython 3.10 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
c7386ebbf48cab3ca7ae90b0946364fd7bf4d6ef34cf2146a4c0163f56fee323
BLAKE2b-256 checksum
How to use checksums
94310826c01b929bf8eb5219f6ed9bae37866e576a17ea876e881742e7eada75
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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

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

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

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

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

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

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

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

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

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

Security for granian 2.8.7

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