Skip to main content

granian

The Rust HTTP server for Python


Granian is a Rust HTTP server for Python applications built on top of Hyper and Tokio.

Rationale

The main reasons behind Granian design are:

  • Have a single, correct HTTP implementation, supporting versions 1, 2 (and eventually 3)
  • Provide a single package for several platforms
  • Avoid the usual Gunicorn + uvicorn + http-tools dependency composition on unix systems
  • Provide stable performance when compared to existing alternatives

Adopting Granian would thus be a good choice when:

  • wanting a modern, single dependency to serve both ASGI and WSGI applications
  • looking for the most performant way to serve your Python application under HTTP/2
  • you need great concurrency capabilities, especially with websockets
  • you care about throughput more than everything else

On the other hand, Granian won't be the ideal option if:

  • you want a pure Python solution
  • you need advanced debugging features
  • your application relies on trio or gevent
  • you're looking for ASGI extensions not (yet) implemented

Features

  • Supports ASGI/3, RSGI and WSGI interface applications
  • HTTP/1 and HTTP/2 protocols
  • HTTPS and mTLS
  • Websockets
  • Direct static files serving
  • ASGI pathsend extension

Quickstart

You can install Granian using pip:

$ pip install granian

ASGI

Create an application in your main.py:

async def app(scope, receive, send):
    assert scope['type'] == 'http'

    await send({
        'type': 'http.response.start',
        'status': 200,
        'headers': [
            [b'content-type', b'text/plain'],
        ],
    })
    await send({
        'type': 'http.response.body',
        'body': b'Hello, world!',
    })

and serve it using Granian CLI:

$ granian --interface asgi main:app

RSGI

Create an application your main.py:

async def app(scope, proto):
    assert scope.proto == 'http'

    proto.response_str(
        status=200,
        headers=[
            ('content-type', 'text/plain')
        ],
        body="Hello, world!"
    )

and serve it using Granian CLI:

$ granian --interface rsgi main:app

WSGI

Create an application your main.py:

def app(environ, start_response):
    start_response('200 OK', [('content-type', 'text/plain')])
    return [b"Hello, world!"]

and serve it using Granian CLI:

$ granian --interface wsgi main:app

Extra dependencies

Mind that Granian also provides several extra dependencies you might be interested into, in particular:

  • dotenv (allows to load environment files)
  • pname (allows to customize processes' names)
  • reload (adds reload on changes functionality)
  • rloop
  • uvloop
  • winloop

You can combine the above extras to suit your needs, eg:

$ pip install granian[pname,uvloop]

For further information, check the options below.

Options

You can check all the options provided by Granian with the --help command:

$ granian --help
Usage: granian [OPTIONS] APP

  APP  Application target to serve.  [required]

Options:
  --host TEXT                     Host address to bind to  [env var:
                                  GRANIAN_HOST; default: (127.0.0.1)]
  --port INTEGER                  Port to bind to.  [env var: GRANIAN_PORT;
                                  default: 8000]
  --uds PATH                      Unix Domain Socket to bind to.  [env var:
                                  GRANIAN_UDS]
  --uds-permissions OCTAL INTEGER
                                  Unix Domain Socket file permissions  [env
                                  var: GRANIAN_UDS_PERMISSIONS]
  --interface [asgi|asginl|rsgi|wsgi]
                                  Application interface type  [env var:
                                  GRANIAN_INTERFACE; default: (rsgi)]
  --http [auto|1|2]               HTTP version  [env var: GRANIAN_HTTP;
                                  default: (auto)]
  --ws / --no-ws                  Enable websockets handling  [env var:
                                  GRANIAN_WEBSOCKETS; default: (enabled)]
  --workers INTEGER RANGE         Number of worker processes  [env var:
                                  GRANIAN_WORKERS; default: 1; x>=1]
  --blocking-threads INTEGER RANGE
                                  Number of blocking threads (per worker)
                                  [env var: GRANIAN_BLOCKING_THREADS; x>=1]
  --blocking-threads-idle-timeout DURATION
                                  The maximum amount of time in seconds (or a
                                  human-readable duration) an idle blocking
                                  thread will be kept alive  [env var:
                                  GRANIAN_BLOCKING_THREADS_IDLE_TIMEOUT;
                                  default: 30; 5<=x<=600]
  --runtime-threads INTEGER RANGE
                                  Number of runtime threads (per worker)  [env
                                  var: GRANIAN_RUNTIME_THREADS; default: 1;
                                  x>=1]
  --runtime-blocking-threads INTEGER RANGE
                                  Number of runtime I/O blocking threads (per
                                  worker)  [env var:
                                  GRANIAN_RUNTIME_BLOCKING_THREADS; x>=1]
  --runtime-mode [auto|mt|st]     Runtime mode to use (single/multi threaded)
                                  [env var: GRANIAN_RUNTIME_MODE; default:
                                  (auto)]
  --loop [auto|asyncio|rloop|uvloop|winloop]
                                  Event loop implementation  [env var:
                                  GRANIAN_LOOP; default: (auto)]
  --task-impl [asyncio|rust]      Async task implementation to use  [env var:
                                  GRANIAN_TASK_IMPL; default: (asyncio)]
  --backlog INTEGER RANGE         Maximum number of connections to hold in
                                  backlog (globally)  [env var:
                                  GRANIAN_BACKLOG; default: 1024; x>=128]
  --backpressure INTEGER RANGE    Maximum number of requests to process
                                  concurrently (per worker)  [env var:
                                  GRANIAN_BACKPRESSURE; default:
                                  (backlog/workers); x>=1]
  --http1-buffer-size INTEGER RANGE
                                  Sets the maximum buffer size for HTTP/1
                                  connections  [env var:
                                  GRANIAN_HTTP1_BUFFER_SIZE; default: 417792;
                                  x>=8192]
  --http1-header-read-timeout INTEGER RANGE
                                  Sets a timeout (in milliseconds) to read
                                  headers  [env var:
                                  GRANIAN_HTTP1_HEADER_READ_TIMEOUT; default:
                                  30000; 1<=x<=60000]
  --http1-keep-alive / --no-http1-keep-alive
                                  Enables or disables HTTP/1 keep-alive  [env
                                  var: GRANIAN_HTTP1_KEEP_ALIVE; default:
                                  (enabled)]
  --http1-pipeline-flush / --no-http1-pipeline-flush
                                  Aggregates HTTP/1 flushes to better support
                                  pipelined responses (experimental)  [env
                                  var: GRANIAN_HTTP1_PIPELINE_FLUSH; default:
                                  (disabled)]
  --http2-adaptive-window / --no-http2-adaptive-window
                                  Sets whether to use an adaptive flow control
                                  for HTTP2  [env var:
                                  GRANIAN_HTTP2_ADAPTIVE_WINDOW; default:
                                  (disabled)]
  --http2-initial-connection-window-size INTEGER RANGE
                                  Sets the max connection-level flow control
                                  for HTTP2  [env var: GRANIAN_HTTP2_INITIAL_C
                                  ONNECTION_WINDOW_SIZE; default: 1048576;
                                  x>=1024]
  --http2-initial-stream-window-size INTEGER RANGE
                                  Sets the `SETTINGS_INITIAL_WINDOW_SIZE`
                                  option for HTTP2 stream-level flow control
                                  [env var:
                                  GRANIAN_HTTP2_INITIAL_STREAM_WINDOW_SIZE;
                                  default: 1048576; x>=1024]
  --http2-keep-alive-interval INTEGER RANGE
                                  Sets an interval (in milliseconds) for HTTP2
                                  Ping frames should be sent to keep a
                                  connection alive  [env var:
                                  GRANIAN_HTTP2_KEEP_ALIVE_INTERVAL;
                                  1<=x<=60000]
  --http2-keep-alive-timeout DURATION
                                  Sets a timeout (in seconds or a human-
                                  readable duration) for receiving an
                                  acknowledgement of the HTTP2 keep-alive ping
                                  [env var: GRANIAN_HTTP2_KEEP_ALIVE_TIMEOUT;
                                  default: 20; x>=1]
  --http2-max-concurrent-streams INTEGER RANGE
                                  Sets the SETTINGS_MAX_CONCURRENT_STREAMS
                                  option for HTTP2 connections  [env var:
                                  GRANIAN_HTTP2_MAX_CONCURRENT_STREAMS;
                                  default: 200; x>=10]
  --http2-max-frame-size INTEGER RANGE
                                  Sets the maximum frame size to use for HTTP2
                                  [env var: GRANIAN_HTTP2_MAX_FRAME_SIZE;
                                  default: 16384; x>=1024]
  --http2-max-headers-size INTEGER RANGE
                                  Sets the max size of received header frames
                                  [env var: GRANIAN_HTTP2_MAX_HEADERS_SIZE;
                                  default: 16777216; x>=1]
  --http2-max-send-buffer-size INTEGER RANGE
                                  Set the maximum write buffer size for each
                                  HTTP/2 stream  [env var:
                                  GRANIAN_HTTP2_MAX_SEND_BUFFER_SIZE; default:
                                  409600; x>=1024]
  --log / --no-log                Enable logging  [env var:
                                  GRANIAN_LOG_ENABLED; default: (enabled)]
  --log-level [critical|error|warning|warn|info|debug|notset]
                                  Log level  [env var: GRANIAN_LOG_LEVEL;
                                  default: (info)]
  --log-config FILE               Logging configuration file (json)  [env var:
                                  GRANIAN_LOG_CONFIG]
  --access-log / --no-access-log  Enable access log  [env var:
                                  GRANIAN_LOG_ACCESS_ENABLED; default:
                                  (disabled)]
  --access-log-fmt TEXT           Access log format  [env var:
                                  GRANIAN_LOG_ACCESS_FMT]
  --ssl-certificate FILE          SSL certificate file  [env var:
                                  GRANIAN_SSL_CERTIFICATE]
  --ssl-keyfile FILE              SSL key file (PKCS#8 format only)  [env var:
                                  GRANIAN_SSL_KEYFILE]
  --ssl-keyfile-password TEXT     SSL key password  [env var:
                                  GRANIAN_SSL_KEYFILE_PASSWORD]
  --ssl-protocol-min [tls1.2|tls1.3]
                                  Set the minimum supported protocol for SSL
                                  connections.  [env var:
                                  GRANIAN_SSL_PROTOCOL_MIN; default: (tls1.3)]
  --ssl-ca FILE                   Root SSL cerificate file for client
                                  verification  [env var: GRANIAN_SSL_CA]
  --ssl-crl FILE                  SSL CRL file(s)  [env var: GRANIAN_SSL_CRL]
  --ssl-client-verify / --no-ssl-client-verify
                                  Verify clients SSL certificates  [env var:
                                  GRANIAN_SSL_CLIENT_VERIFY; default:
                                  (disabled)]
  --url-path-prefix TEXT          URL path prefix the app is mounted on  [env
                                  var: GRANIAN_URL_PATH_PREFIX]
  --respawn-failed-workers / --no-respawn-failed-workers
                                  Enable workers respawn on unexpected exit
                                  [env var: GRANIAN_RESPAWN_FAILED_WORKERS;
                                  default: (disabled)]
  --respawn-interval FLOAT        The number of seconds to sleep between
                                  workers respawn  [env var:
                                  GRANIAN_RESPAWN_INTERVAL; default: 3.5]
  --rss-sample-interval DURATION  The sample rate in seconds (or a human-
                                  readable duration) for the resource monitor
                                  [env var: GRANIAN_RSS_SAMPLE_INTERVAL;
                                  default: 30; 1<=x<=300]
  --rss-samples INTEGER RANGE     The number of consecutive samples to
                                  consider a worker over resource limit  [env
                                  var: GRANIAN_RSS_SAMPLES; default: 1; x>=1]
  --workers-lifetime DURATION     The maximum amount of time in seconds (or a
                                  human-readable duration) a worker will be
                                  kept alive before respawn  [env var:
                                  GRANIAN_WORKERS_LIFETIME; x>=60]
  --workers-max-rss INTEGER RANGE
                                  The maximum amount of memory (in MiB) a
                                  worker can consume before respawn  [env var:
                                  GRANIAN_WORKERS_MAX_RSS; x>=1]
  --workers-kill-timeout DURATION
                                  The amount of time in seconds (or a human-
                                  readable duration) to wait for killing
                                  workers that refused to gracefully stop
                                  [env var: GRANIAN_WORKERS_KILL_TIMEOUT;
                                  default: (disabled); 1<=x<=1800]
  --factory / --no-factory        Treat target as a factory function, that
                                  should be invoked to build the actual target
                                  [env var: GRANIAN_FACTORY; default:
                                  (disabled)]
  --working-dir DIRECTORY         Set the working directory  [env var:
                                  GRANIAN_WORKING_DIR]
  --env-files FILE                Environment file(s) to load (requires
                                  granian[dotenv] extra)  [env var:
                                  GRANIAN_ENV_FILES]
  --static-path-route TEXT        Route(s) for static file serving  [env var:
                                  GRANIAN_STATIC_PATH_ROUTE; default:
                                  (/static)]
  --static-path-mount DIRECTORY   Path(s) to mount for static file serving
                                  [env var: GRANIAN_STATIC_PATH_MOUNT]
  --static-path-dir-to-file TEXT  Serve the specified file as the index for
                                  directory listings  [env var:
                                  GRANIAN_STATIC_PATH_DIR_TO_FILE]
  --static-path-expires DURATION  Cache headers expiration (in seconds or a
                                  human-readable duration) for static file
                                  serving. 0 to disable.  [env var:
                                  GRANIAN_STATIC_PATH_EXPIRES; default: 86400;
                                  x>=0]
  --metrics / --no-metrics        Enable the prometheus metrics exporter.
                                  [env var: GRANIAN_METRICS_ENABLED; default:
                                  (disabled)]
  --metrics-scrape-interval DURATION
                                  Configure the interval for metrics
                                  collection.  [env var:
                                  GRANIAN_METRICS_SCRAPE_INTERVAL; default:
                                  15; 1<=x<=60]
  --metrics-address TEXT          Metrics exporter host address to bind to
                                  [env var: GRANIAN_METRICS_ADDRESS; default:
                                  (127.0.0.1)]
  --metrics-port INTEGER          Metrics exporter port to bind to.  [env var:
                                  GRANIAN_METRICS_PORT; default: 9090]
  --reload / --no-reload          Enable auto reload on application's files
                                  changes (requires granian[reload] extra)
                                  [env var: GRANIAN_RELOAD; default:
                                  (disabled)]
  --reload-paths PATH             Paths to watch for changes  [env var:
                                  GRANIAN_RELOAD_PATHS; default: (Working
                                  directory)]
  --reload-ignore-dirs TEXT       Names of directories to ignore changes for.
                                  Extends the default list of directories to
                                  ignore in watchfiles' default filter  [env
                                  var: GRANIAN_RELOAD_IGNORE_DIRS]
  --reload-ignore-patterns TEXT   File/directory name patterns (regex) to
                                  ignore changes for. Extends the default list
                                  of patterns to ignore in watchfiles' default
                                  filter  [env var:
                                  GRANIAN_RELOAD_IGNORE_PATTERNS]
  --reload-ignore-paths PATH      Absolute paths to ignore changes for  [env
                                  var: GRANIAN_RELOAD_IGNORE_PATHS]
  --reload-tick INTEGER RANGE     The tick frequency (in milliseconds) the
                                  reloader watch for changes  [env var:
                                  GRANIAN_RELOAD_TICK; default: 50;
                                  50<=x<=5000]
  --reload-ignore-worker-failure / --no-reload-ignore-worker-failure
                                  Ignore worker failures when auto reload is
                                  enabled  [env var:
                                  GRANIAN_RELOAD_IGNORE_WORKER_FAILURE;
                                  default: (disabled)]
  --process-name TEXT             Set a custom name for processes (requires
                                  granian[pname] extra)  [env var:
                                  GRANIAN_PROCESS_NAME]
  --pid-file FILE                 A path to write the PID file to  [env var:
                                  GRANIAN_PID_FILE]
  --version                       Show the version and exit.
  --help                          Show this message and exit.

Human-readable durations

Whenever Granian accepts a duration, it can be specified either as sole number, in which case it is interpreted as a number of seconds, or using one of the following suffixes:

suffix meaning
s seconds (same as no suffix)
m minutes
h hours
d days

Logging

Despite being a Rust project, Granian is a good Python citizen and uses the standard library's logging module to produce logs. This means you can freely configure your logging level and format using the standard idioms you probably familiar with.

As many other web servers, Granian uses two different loggers, specifically:

  • the _granian logger for runtime messages
  • the granian.access logger for access logs

Access log format

The access log format can be configured by specifying the atoms (see below) to include in a specific format. By default Granian will use [%(time)s] %(addr)s - "%(method)s %(path)s %(protocol)s" %(status)d %(dt_ms).3f as the format.

Access log atoms

The following atoms are available for use:

identifier description
addr Client remote address
time Datetime of the request
dt_ms Request duration in ms
status HTTP response status
path Request path (without query string)
query_string Request query string
method Request HTTP method
scheme Request scheme
protocol HTTP protocol version
header{header-name} Request header value for the provided (case insensitive) header-name

Workers and threads

Granian offers different options to configure the number of workers and threads to be run, in particular:

  • workers: the total number of processes holding a dedicated Python interpreter that will run the application
  • blocking threads: the number of threads per worker interacting with the Python interpreter
  • runtime threads: the number of Rust threads per worker that will perform network I/O
  • runtime blocking threads: the number of Rust threads per worker involved in blocking operations. The main role of these threads is dealing with blocking I/O – like file system operations.

In general, Granian will try its best to automatically pick proper values for the threading configuration, leaving to you the responsibility to choose the number of workers you need.
There is no golden rule here, as these numbers will vastly depend both on your application behavior and the deployment target, but we can list some suggestions:

  • matching the amount of CPU cores for the workers is generally the best starting point; on containerized environments like docker or k8s is best to have 1 worker per container though and scale your containers using the relevant orchestrator;
  • the default number of runtime threads and runtime blocking threads is fine for the vast majority of applications out there; you might want to increase the first for applications dealing with several concurrently opened websockets or if you primarily use HTTP/2, and lowering the second only if you serve the same few files to a lot of connections;

In regards of blocking threads, the option is irrelevant on asynchronous protocols, as all the interop will happen with the AsyncIO event loop which will also be the one holding the GIL for the vast majority of the time, and thus the value is fixed to a single thread; on synchronous protocols like WSGI instead, it will be the maximum amount of threads interacting – and thus trying to acquire the GIL – with your application code. All those threads will be spawned on-demand depending on the amount of concurrency, and they'll be shutdown after the amount of inactivity time specified with the relevant setting.
In general, and unless you have a very specific use-case to do so (for example, if your application have an average millisecond response, a very limited amount of blocking threads usually delivers better throughput) you should avoid to tune this threadpool size and configure a backpressure value that suits your needs instead. In that regards, please check the next section.

Also, you should generally avoid to configure workers and threads based on numbers suggested for other servers, as Granian architecture is quite different from projects like Gunicorn or Uvicorn.

Note: using multiple workers and respawn options (lifetime, max memory) on Linux requires kernel versions >= 5.14 and the net.ipv4.tcp_migrate_req syctl option enabled. Otherwise, during workers respawns, queued connections in the backlog might be dropped.

Backpressure

Since Granian runs a separated Rust runtime aside of your application that will handle I/O and "send work" to the Python interpreter, a mechanism to avoid pushing more work that what the Python interpreter can actually do is provided: backpressure.

Backpressure in Granian operates at the single worker's connections accept loop, practically interrupting the loop in case too many requests are waiting to be processed down the line. It is a per-worker concurrency limiter: connections exceeding the configured value will wait in the worker's own socket queue – the network stack backlog provided by the OS kernel (and configured with the apposite parameter).

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

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

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

Runtime mode

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

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

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

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

Metrics

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

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

Static files

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

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

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

Serving a specific file for directory listings

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

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

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

Proxies and forwarded headers

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

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

from granian.utils.proxies import wrap_asgi_with_proxy_headers, wrap_wsgi_with_proxy_headers

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

def my_wsgi_app(environ, start_response):
    ...

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

With these wrappers, Granian will use:

and replace the relevant request scope attributes with these values.

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

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

Free-threaded Python

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

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

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

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

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

Customising Granian

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

AsyncIO event loop initialization

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

import asyncio
from granian import Granian, loops

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


Granian(...).serve()

Hooks

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

  • on_startup
  • on_shutdown
  • on_reload

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

from granian import Granian

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

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

Embedding Granian in your project

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

Warning: the embeddable server is still experimental.

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

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

from granian.server.embed import Server

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

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

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

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

  • stop
  • reload

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

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

Project status

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

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

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

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

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

License

Granian is released under the BSD License.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

granian-2.8.1.tar.gz (129.3 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

granian-2.8.1-pp311-pypy311_pp73-win_amd64.whl (3.1 MB view details)

Uploaded PyPyWindows x86-64

granian-2.8.1-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl (5.0 MB view details)

Uploaded PyPymusllinux: musl 1.1+ x86-64

granian-2.8.1-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl (5.0 MB view details)

Uploaded PyPymusllinux: musl 1.1+ ARMv7l

granian-2.8.1-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl (5.1 MB view details)

Uploaded PyPymusllinux: musl 1.1+ ARM64

granian-2.8.1-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl (5.1 MB view details)

Uploaded PyPymanylinux: glibc 2.28+ ARM64

granian-2.8.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.0 MB view details)

Uploaded PyPymanylinux: glibc 2.17+ x86-64

granian-2.8.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl (4.3 MB view details)

Uploaded PyPymacOS 11.0+ ARM64

granian-2.8.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl (4.5 MB view details)

Uploaded PyPymacOS 10.12+ x86-64

granian-2.8.1-cp315-cp315t-win_amd64.whl (3.1 MB view details)

Uploaded CPython 3.15tWindows x86-64

granian-2.8.1-cp315-cp315t-musllinux_1_1_x86_64.whl (5.0 MB view details)

Uploaded CPython 3.15tmusllinux: musl 1.1+ x86-64

granian-2.8.1-cp315-cp315t-musllinux_1_1_armv7l.whl (4.9 MB view details)

Uploaded CPython 3.15tmusllinux: musl 1.1+ ARMv7l

granian-2.8.1-cp315-cp315t-musllinux_1_1_aarch64.whl (5.1 MB view details)

Uploaded CPython 3.15tmusllinux: musl 1.1+ ARM64

granian-2.8.1-cp315-cp315t-manylinux_2_28_aarch64.whl (4.9 MB view details)

Uploaded CPython 3.15tmanylinux: glibc 2.28+ ARM64

granian-2.8.1-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.7 MB view details)

Uploaded CPython 3.15tmanylinux: glibc 2.17+ x86-64

granian-2.8.1-cp315-cp315t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (4.8 MB view details)

Uploaded CPython 3.15tmanylinux: glibc 2.17+ ARMv7l

granian-2.8.1-cp315-cp315t-manylinux_2_12_i686.manylinux2010_i686.whl (4.3 MB view details)

Uploaded CPython 3.15tmanylinux: glibc 2.12+ i686

granian-2.8.1-cp315-cp315t-macosx_11_0_arm64.whl (4.2 MB view details)

Uploaded CPython 3.15tmacOS 11.0+ ARM64

granian-2.8.1-cp315-cp315t-macosx_10_12_x86_64.whl (4.4 MB view details)

Uploaded CPython 3.15tmacOS 10.12+ x86-64

granian-2.8.1-cp315-cp315-win_amd64.whl (3.1 MB view details)

Uploaded CPython 3.15Windows x86-64

granian-2.8.1-cp315-cp315-musllinux_1_1_x86_64.whl (5.0 MB view details)

Uploaded CPython 3.15musllinux: musl 1.1+ x86-64

granian-2.8.1-cp315-cp315-musllinux_1_1_armv7l.whl (4.9 MB view details)

Uploaded CPython 3.15musllinux: musl 1.1+ ARMv7l

granian-2.8.1-cp315-cp315-musllinux_1_1_aarch64.whl (5.1 MB view details)

Uploaded CPython 3.15musllinux: musl 1.1+ ARM64

granian-2.8.1-cp315-cp315-manylinux_2_28_aarch64.whl (5.1 MB view details)

Uploaded CPython 3.15manylinux: glibc 2.28+ ARM64

granian-2.8.1-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.9 MB view details)

Uploaded CPython 3.15manylinux: glibc 2.17+ x86-64

granian-2.8.1-cp315-cp315-manylinux_2_17_i686.manylinux2014_i686.whl (4.4 MB view details)

Uploaded CPython 3.15manylinux: glibc 2.17+ i686

granian-2.8.1-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (4.8 MB view details)

Uploaded CPython 3.15manylinux: glibc 2.17+ ARMv7l

granian-2.8.1-cp315-cp315-macosx_11_0_arm64.whl (4.3 MB view details)

Uploaded CPython 3.15macOS 11.0+ ARM64

granian-2.8.1-cp315-cp315-macosx_10_12_x86_64.whl (4.4 MB view details)

Uploaded CPython 3.15macOS 10.12+ x86-64

granian-2.8.1-cp314-cp314t-win_amd64.whl (3.1 MB view details)

Uploaded CPython 3.14tWindows x86-64

granian-2.8.1-cp314-cp314t-musllinux_1_1_x86_64.whl (5.0 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.1+ x86-64

granian-2.8.1-cp314-cp314t-musllinux_1_1_armv7l.whl (4.9 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.1+ ARMv7l

granian-2.8.1-cp314-cp314t-musllinux_1_1_aarch64.whl (5.1 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.1+ ARM64

granian-2.8.1-cp314-cp314t-manylinux_2_28_aarch64.whl (4.9 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.28+ ARM64

granian-2.8.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.7 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ x86-64

granian-2.8.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (4.8 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ ARMv7l

granian-2.8.1-cp314-cp314t-manylinux_2_12_i686.manylinux2010_i686.whl (4.3 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.12+ i686

granian-2.8.1-cp314-cp314t-macosx_11_0_arm64.whl (4.2 MB view details)

Uploaded CPython 3.14tmacOS 11.0+ ARM64

granian-2.8.1-cp314-cp314t-macosx_10_12_x86_64.whl (4.4 MB view details)

Uploaded CPython 3.14tmacOS 10.12+ x86-64

granian-2.8.1-cp314-cp314-win_amd64.whl (3.1 MB view details)

Uploaded CPython 3.14Windows x86-64

granian-2.8.1-cp314-cp314-musllinux_1_1_x86_64.whl (5.0 MB view details)

Uploaded CPython 3.14musllinux: musl 1.1+ x86-64

granian-2.8.1-cp314-cp314-musllinux_1_1_armv7l.whl (4.9 MB view details)

Uploaded CPython 3.14musllinux: musl 1.1+ ARMv7l

granian-2.8.1-cp314-cp314-musllinux_1_1_aarch64.whl (5.1 MB view details)

Uploaded CPython 3.14musllinux: musl 1.1+ ARM64

granian-2.8.1-cp314-cp314-manylinux_2_28_aarch64.whl (5.1 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ ARM64

granian-2.8.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.9 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64

granian-2.8.1-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl (4.4 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ i686

granian-2.8.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (4.8 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ ARMv7l

granian-2.8.1-cp314-cp314-macosx_11_0_arm64.whl (4.3 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

granian-2.8.1-cp314-cp314-macosx_10_12_x86_64.whl (4.4 MB view details)

Uploaded CPython 3.14macOS 10.12+ x86-64

granian-2.8.1-cp313-cp313-win_amd64.whl (3.1 MB view details)

Uploaded CPython 3.13Windows x86-64

granian-2.8.1-cp313-cp313-musllinux_1_1_x86_64.whl (5.0 MB view details)

Uploaded CPython 3.13musllinux: musl 1.1+ x86-64

granian-2.8.1-cp313-cp313-musllinux_1_1_armv7l.whl (4.9 MB view details)

Uploaded CPython 3.13musllinux: musl 1.1+ ARMv7l

granian-2.8.1-cp313-cp313-musllinux_1_1_aarch64.whl (5.1 MB view details)

Uploaded CPython 3.13musllinux: musl 1.1+ ARM64

granian-2.8.1-cp313-cp313-manylinux_2_28_aarch64.whl (5.2 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ ARM64

granian-2.8.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.0 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

granian-2.8.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl (4.4 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ i686

granian-2.8.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (4.8 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARMv7l

granian-2.8.1-cp313-cp313-macosx_11_0_arm64.whl (4.3 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

granian-2.8.1-cp313-cp313-macosx_10_12_x86_64.whl (4.4 MB view details)

Uploaded CPython 3.13macOS 10.12+ x86-64

granian-2.8.1-cp312-cp312-win_amd64.whl (3.1 MB view details)

Uploaded CPython 3.12Windows x86-64

granian-2.8.1-cp312-cp312-musllinux_1_1_x86_64.whl (5.0 MB view details)

Uploaded CPython 3.12musllinux: musl 1.1+ x86-64

granian-2.8.1-cp312-cp312-musllinux_1_1_armv7l.whl (4.9 MB view details)

Uploaded CPython 3.12musllinux: musl 1.1+ ARMv7l

granian-2.8.1-cp312-cp312-musllinux_1_1_aarch64.whl (5.1 MB view details)

Uploaded CPython 3.12musllinux: musl 1.1+ ARM64

granian-2.8.1-cp312-cp312-manylinux_2_28_aarch64.whl (5.2 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ ARM64

granian-2.8.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.0 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

granian-2.8.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl (4.4 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ i686

granian-2.8.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (4.8 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARMv7l

granian-2.8.1-cp312-cp312-macosx_11_0_arm64.whl (4.3 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

granian-2.8.1-cp312-cp312-macosx_10_12_x86_64.whl (4.4 MB view details)

Uploaded CPython 3.12macOS 10.12+ x86-64

granian-2.8.1-cp311-cp311-win_amd64.whl (3.1 MB view details)

Uploaded CPython 3.11Windows x86-64

granian-2.8.1-cp311-cp311-musllinux_1_1_x86_64.whl (5.0 MB view details)

Uploaded CPython 3.11musllinux: musl 1.1+ x86-64

granian-2.8.1-cp311-cp311-musllinux_1_1_armv7l.whl (4.9 MB view details)

Uploaded CPython 3.11musllinux: musl 1.1+ ARMv7l

granian-2.8.1-cp311-cp311-musllinux_1_1_aarch64.whl (5.0 MB view details)

Uploaded CPython 3.11musllinux: musl 1.1+ ARM64

granian-2.8.1-cp311-cp311-manylinux_2_28_aarch64.whl (5.1 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ ARM64

granian-2.8.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.0 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

granian-2.8.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl (4.4 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ i686

granian-2.8.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (4.8 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARMv7l

granian-2.8.1-cp311-cp311-macosx_11_0_arm64.whl (4.3 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

granian-2.8.1-cp311-cp311-macosx_10_12_x86_64.whl (4.5 MB view details)

Uploaded CPython 3.11macOS 10.12+ x86-64

granian-2.8.1-cp310-cp310-win_amd64.whl (3.1 MB view details)

Uploaded CPython 3.10Windows x86-64

granian-2.8.1-cp310-cp310-musllinux_1_1_x86_64.whl (5.1 MB view details)

Uploaded CPython 3.10musllinux: musl 1.1+ x86-64

granian-2.8.1-cp310-cp310-musllinux_1_1_armv7l.whl (4.9 MB view details)

Uploaded CPython 3.10musllinux: musl 1.1+ ARMv7l

granian-2.8.1-cp310-cp310-musllinux_1_1_aarch64.whl (5.2 MB view details)

Uploaded CPython 3.10musllinux: musl 1.1+ ARM64

granian-2.8.1-cp310-cp310-manylinux_2_28_aarch64.whl (5.2 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ ARM64

granian-2.8.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.0 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

granian-2.8.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl (4.5 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ i686

granian-2.8.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (4.8 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARMv7l

granian-2.8.1-cp310-cp310-macosx_11_0_arm64.whl (4.3 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

granian-2.8.1-cp310-cp310-macosx_10_12_x86_64.whl (4.5 MB view details)

Uploaded CPython 3.10macOS 10.12+ x86-64

File details

Details for the file granian-2.8.1.tar.gz.

File metadata

  • Download URL: granian-2.8.1.tar.gz
  • Upload date:
  • Size: 129.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for granian-2.8.1.tar.gz
Algorithm Hash digest
SHA256 41a7954e10621ca46f9bfe829a42272e4796358cc4bf27a9253f3171f871a397
MD5 2be346da1e18a69ba21d011c5e5b2906
BLAKE2b-256 d3a28429f7cd27c99ae954be8663ca46067e0d31ee84fb887a25406a9e5bc8f8

See more details on using hashes here.

File details

Details for the file granian-2.8.1-pp311-pypy311_pp73-win_amd64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-pp311-pypy311_pp73-win_amd64.whl
Algorithm Hash digest
SHA256 ae335ad901fe71db0b2804e352d150c8743199fb2c9feb04ccc378dc3039339b
MD5 dc84cc0f9e7175069d62867df6110e57
BLAKE2b-256 695ac57fc54edcf54cd6767346abc07f42b05dbc266b48cffd985e56ff9ef1b4

See more details on using hashes here.

File details

Details for the file granian-2.8.1-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 4dee45790280f33ccdd88ec1b9ce38c9b636c3afb6830c44ce08139cb2d5cf29
MD5 5669727a837e21ad660cd7db5861d53a
BLAKE2b-256 c9d58050ff571c3218f5a384a61417ef62c84aa52160673cb4e8ddf618a8dda9

See more details on using hashes here.

File details

Details for the file granian-2.8.1-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl.

File metadata

File hashes

Hashes for granian-2.8.1-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl
Algorithm Hash digest
SHA256 d12cbc217d5c24e1a95fe8ab3afa28b4597a1c54a12ad28d15fd5bf0aa28db24
MD5 4974b1436045c3fd926d578165d8dab7
BLAKE2b-256 6b63c21e752c803b58c072f6c1087a16f06149277c522892f846d19b5bb02a74

See more details on using hashes here.

File details

Details for the file granian-2.8.1-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 167680d0833ca13c174d93b571d900620f8832e4c9ce1d1e122dd45984a22563
MD5 a17f00c41c13070f6a96b57f446bdf61
BLAKE2b-256 0991bf08719fda69c354b9057923142ed0dd5a3c256f490df5b47611c2907061

See more details on using hashes here.

File details

Details for the file granian-2.8.1-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 ec3ec4d91d0d3d50ffaeece6defb9003b6ebfefe661077486377e4dd56cee731
MD5 c5b98c3c6c705a10d2c8358034891452
BLAKE2b-256 176045d48d2922e175ccdff5e15f0e2ce785691ad503afec255374ad3312e816

See more details on using hashes here.

File details

Details for the file granian-2.8.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 677ab00528759731a0553c18e0b426fbce082517d02162ac82ac29cecfca5e9c
MD5 290be490f7dc2862cb660d141a385d78
BLAKE2b-256 4dc7748cacbb9d370f1e0435ca6764274584616ca454742bea934d01b66cf7e2

See more details on using hashes here.

File details

Details for the file granian-2.8.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 eb5dd55ac99943b7e70780a9dcc0f02da3d2236f57746ade6c4b24e6ca8500df
MD5 e512b6d9c274ee12e3e10f0aaf6bc983
BLAKE2b-256 3edace3d004675d72936c3940af2210808046ee7641e86279c47f774eef60791

See more details on using hashes here.

File details

Details for the file granian-2.8.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 3f4b635edfdcfea7041a04986d338d7ff4eabf64779bbf42f1ed7551638f053e
MD5 2ef51bd20eb3cca14541f1e96c9a12d9
BLAKE2b-256 4bc8ed2c0f430114f98424179d2c7a9d26772c67684207489d7c42384b80c4ea

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp315-cp315t-win_amd64.whl.

File metadata

  • Download URL: granian-2.8.1-cp315-cp315t-win_amd64.whl
  • Upload date:
  • Size: 3.1 MB
  • Tags: CPython 3.15t, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for granian-2.8.1-cp315-cp315t-win_amd64.whl
Algorithm Hash digest
SHA256 f166496c30c49361381d19f8a632fa13ecccad3854ae39b0001d499d3efe3bd7
MD5 604a470817e2fd05ed59c966a653c286
BLAKE2b-256 22e1a74b3a62c92e314a7153ad017531b838ecc5a869d9265b80179a172abdd1

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp315-cp315t-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp315-cp315t-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 5836a2b2de833e252be2b07e6e21f2440c6c1e10a5ed528b860261d3f48d6551
MD5 1ceebbbe90e44fb0637b84feb399aeb9
BLAKE2b-256 4d2e9d2d8dc6b9bc12099595a55f5320f63baf74852932cb47495283cb3b10ed

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp315-cp315t-musllinux_1_1_armv7l.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp315-cp315t-musllinux_1_1_armv7l.whl
Algorithm Hash digest
SHA256 f624074c54e4c5944b30c875294633527dbe145d7f1751ff2d0c7d61246d1717
MD5 c506dbc8d96ad182ef4d3fe6ef26e209
BLAKE2b-256 64ba827b48d1c27ec6ab0d97f3fd66a097b390e7359589d086dcf997ec9ee351

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp315-cp315t-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp315-cp315t-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 277f00fe9aa6d415936d6748fab3f2a3361a63691654e2c80bf8e5dc0fcde080
MD5 1a2e1fde874d7b76c3116f83d316dfd1
BLAKE2b-256 db260331d3351608c8e42959dff43986692627a35439cc6948cda606cf2de7ca

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp315-cp315t-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp315-cp315t-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 e401edbcef575b6f8121349d78df061f555d08058a9233920fcfdef15fd91ded
MD5 8968289fb837a890d68c693f3d933475
BLAKE2b-256 003a6aee2be22014062685cc03be75d0fa840be3b82b2af007eca9f67e97cae7

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 85036b45494ac0d980c6d645a84895cbde21d1ed239155a496927c6f1af540ac
MD5 1d5141f81e696a94590d4dd9d5b10e04
BLAKE2b-256 4d3cb63bfa7b10a321d7b501c5080f1712cda4d17be6ce5d7fd6100e2345deae

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp315-cp315t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp315-cp315t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 5cf9c1fbb5a9ed1c8365e56605bf90ccc3fdf8bf40b7cb486743038c1dab2ed2
MD5 8230fbd7f590c4398df0d8b0bba6d9b0
BLAKE2b-256 062361c3da2c5365ff9b5536b0ee0a6436cdc99a0bb70ef982a20f4f32a276a2

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp315-cp315t-manylinux_2_12_i686.manylinux2010_i686.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp315-cp315t-manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 f64fca05bbf79f079b8ae91111127011dab0c3240fe4806058500d161aa15b95
MD5 aba6ba31eacab4f66effb426176a7633
BLAKE2b-256 5f467561a85657df37fbc0fb3bc42fd529374d8457f3e5a64092a9daa135302e

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp315-cp315t-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp315-cp315t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 bb0f33272483e512c9545edefc5feaa70588cc84853a4512ec6817c53abeda54
MD5 d98ccb961096afdbc3f86b700858e734
BLAKE2b-256 17d12de43e557d0c28a8f6f96165c00a9723ea5c990e0a8bb8854acf8d620a3e

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp315-cp315t-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp315-cp315t-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 0f49447482471edbd9578e8ce8433c761fac3aaf685263ab1ed5456714509956
MD5 03201cb8816a98f2a26aa3d6b17840d3
BLAKE2b-256 dbce6eea88dfaa12f938d94fe6c95f5dd79e071f8c0cc298843be824cea3bc9d

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp315-cp315-win_amd64.whl.

File metadata

  • Download URL: granian-2.8.1-cp315-cp315-win_amd64.whl
  • Upload date:
  • Size: 3.1 MB
  • Tags: CPython 3.15, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for granian-2.8.1-cp315-cp315-win_amd64.whl
Algorithm Hash digest
SHA256 a087f6bfb1c745082d3864b60e8add5810e16ee29c59006378f2fe9a4fa09f88
MD5 afbb132bbf6a266ad29e05d9ed17b70d
BLAKE2b-256 e39c7b5cf729a9b57436fa59c2d68b03306feca92701cd02c2f39be128e8293c

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp315-cp315-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp315-cp315-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 3679e540f16c49d57a14c08ce485482e2da66e4655f99d5a64d28e32057fabdb
MD5 89ec017e3dbe5c79e8dc233fc66814cd
BLAKE2b-256 9658281b96e0f734d7b159edfb903b311437d603680eec59bd3093a357ee217b

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp315-cp315-musllinux_1_1_armv7l.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp315-cp315-musllinux_1_1_armv7l.whl
Algorithm Hash digest
SHA256 2ea4b7d14ba7aadbf8362aa22fd89f1c510f810e4f46e2f5be52523472e5a20f
MD5 e06d00c989dfee09d55dace8a2cdeb34
BLAKE2b-256 0d8daa6e2ca4caf4bee6dce64240945cc96c282707e7284df1dcef0ead4563c0

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp315-cp315-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp315-cp315-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 5bab997125ee1b6261543ab0a9c26c58799124911654ad48fee55552241b6406
MD5 900c5be6cea66cb259a4ecb891639e71
BLAKE2b-256 c7bbe51dfee0755f42e52accbe35e4ec30086a08f5794344cb7668718c9ab637

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp315-cp315-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp315-cp315-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 bd4bac411e108d63965d296d0f2a90282e7535f3e71965b337b670fc7121badc
MD5 a195f94e3fe8f4bac54ccf9c5c5e4ac8
BLAKE2b-256 afcc18e63284494862b6de9bd19e4ee5b4fb692cffd9b51da221083cf7a8c4e7

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a18bb543dc4bbdf605ce3f4044b46f642e7094e68f10e15ccc671db5eda4c1c8
MD5 734b9397a8c600f5c2b10320c8362a02
BLAKE2b-256 1b674992015a32458000ab6a9833f9e1eec964428c78b60f8bdaf2ce16c49e74

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp315-cp315-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp315-cp315-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 d17d9ee0b5a167ef6b92888da2987a422e88e18679c66e963f09113fcffa48f7
MD5 179bff388bde64da6c9b2a05920db77b
BLAKE2b-256 36d89f1d09daad55fb88fecb01711740e5d1cbc272c8d88436bef9d3d935125e

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 7cd970974fefda13eeb8efe6073e80e985673fe014d9fc57375e54685c91043b
MD5 5cadf738490ea9893ccd29f97cafd871
BLAKE2b-256 19bafb87565f728f7f3959d8f0b0aa6b06551a92e819187a843758f9d7ddfcd7

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp315-cp315-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp315-cp315-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 cddcbd2c3a2dc0bca1f7ea0df1e768bba66657b47a212c36e588b10b56b03da6
MD5 ca9bbc3c2cd1ea85c7dc3ccdd4521303
BLAKE2b-256 4c1057b8bfec161d9ca22b71f76e81f85177548f6b368506d90fafe132dfd953

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp315-cp315-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp315-cp315-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 c5189bce61b601b5d98695b793adf24f596c48d44321d725a33ddfbcf0ec8905
MD5 efe858b33f97088bd1ac6fb4eaeed983
BLAKE2b-256 7f43d41504a8796b28bac830dbc40626e480d6250424b692ff018c955bdd81ac

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp314-cp314t-win_amd64.whl.

File metadata

  • Download URL: granian-2.8.1-cp314-cp314t-win_amd64.whl
  • Upload date:
  • Size: 3.1 MB
  • Tags: CPython 3.14t, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for granian-2.8.1-cp314-cp314t-win_amd64.whl
Algorithm Hash digest
SHA256 92962ee552fd69ca288bd560da62632f7f3eb4481a72831ac6de942d5ade7b2c
MD5 33304749e3fa8be0a189f0fa19572958
BLAKE2b-256 fb71b4649b173578fac6030957d387f5fda4d8f74dd5bb859c48ee462438426d

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp314-cp314t-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp314-cp314t-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 82cb3e201c18110981d13cf2f1db3c48d315d5f7930460fd7dc76eda3effa06c
MD5 90c44d14038b2cca51b06a7fafe3c5cb
BLAKE2b-256 3034414733c5c974fa17fcb6e8774a925413613d7a70eeebd5f6132ca8d4bdab

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp314-cp314t-musllinux_1_1_armv7l.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp314-cp314t-musllinux_1_1_armv7l.whl
Algorithm Hash digest
SHA256 f444950c84b92fa270997bcb188035f826ce34711d97940d11c044b3a624c169
MD5 7014379c18d6e247877a7e5ad7cdb0fe
BLAKE2b-256 2f2b713ced986615bff43c0ef16959741200ffea18d86246b82dc43da3f80823

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp314-cp314t-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp314-cp314t-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 ef74713cc3b50ffcfc95534a8a0161881e9a8936073da5a092d9190673811e6c
MD5 7ef3d9d2aa59d815cccd570498e0cdc7
BLAKE2b-256 a46f63b945143d8718e7e8444e621de1574566ddc3cc53d3d05abf127f1fa3e1

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp314-cp314t-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp314-cp314t-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 c98361198fb8ffed51120dee2fc306bbba157d74c0072619115b23ab28cb4518
MD5 01952e37083e201250af02385a68807e
BLAKE2b-256 d0f22f0680b3aa52be30eb55cbb57be6baa7d3f9fa8f8ca6dc7eb93bfcdcb7fe

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 af4da85029925d44bd30a7b4015c8c44139c0119ae428098719948455cfd6ccb
MD5 bd8e3e379d65f66f79c2754c52c8ed84
BLAKE2b-256 90aafb1d51bc2a7f717c4643970ff16e232d93cb89f71880b2d57923c860d991

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 9a28b881994f45b4cd75d3a2bf188a7b1c8a5940e1461d82da2d831835267bdf
MD5 5aae8196fd7bcd248883effda17d2c1a
BLAKE2b-256 4b3b2af12d8d0b3013a32d64f7902010dfea416865af6f02ca61e9bae24a25c6

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp314-cp314t-manylinux_2_12_i686.manylinux2010_i686.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp314-cp314t-manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 7be6d745e29d29a8232a29a3801382f52a4315b3eb3214e13f4c4eefeffb70b9
MD5 5ba95bd3b09c8912d9b103e95d1979de
BLAKE2b-256 9b8ec89b398ad5fa86aa88caa407c3793e071715c6aea5d0cabc5b2b4039aed4

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp314-cp314t-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp314-cp314t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 be23e3b099ba3ab169a0de5894fe6116112067a48a79a601b824dfc0d63840fa
MD5 943d40de0a7cf64e1c758e5c266a4cc0
BLAKE2b-256 fab85ba4e30917ae247cebc05b52fd6db04bd40beea108be8524e5c168c35251

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp314-cp314t-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp314-cp314t-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 579e79a0f045cf5372418cb8964c156961bbc31317802e93bd3656d505f634c4
MD5 08cd9e8d8248e2d01952ed00c0f546e4
BLAKE2b-256 01b406090ece7b13712084a466688fe9b215480593e9e7c534fc4f327b813edb

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: granian-2.8.1-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 3.1 MB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for granian-2.8.1-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 996934329308719db41659468c48f9c0650f7cba7a63e0b4ec003b55b08be818
MD5 3dc4284bfee7cb0e517640a781dff502
BLAKE2b-256 7807b6b9eb1ebec0a2d524eb3614911b276dc3236a57c2884a27409d6be68f19

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp314-cp314-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp314-cp314-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 8f05c79a9eb4d2263e599727f588ec286fe4a9759d5164b43eaf30f9b94c6fdd
MD5 0fc4b0f9368e3bd39cd7232e7649a506
BLAKE2b-256 1da66eea0ec270c526e1ca2e25adce30c4255f3d7a7f31bee68cd18c41fe9ddc

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp314-cp314-musllinux_1_1_armv7l.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp314-cp314-musllinux_1_1_armv7l.whl
Algorithm Hash digest
SHA256 f5940fe525bf732ea148749d1e24f39ed1edf3fae4aed0b3f698d01e04d63c12
MD5 3baeff5910da036c3e0ca4721eec0fcd
BLAKE2b-256 67160441aeee2659f5d0510f664b444785e20809f1060e4fb245c74b995782ee

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp314-cp314-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp314-cp314-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 872870943196e84b1c7ee80d5d857b76061091eed02fb953f9603c1fdf72426e
MD5 82939f45d6384a81e6475de6221ac771
BLAKE2b-256 41c466bb1783d19f2cbd523795043acc4699027145061babbef78ab1e4645f01

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp314-cp314-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp314-cp314-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 88ec7b24cce99c73fc1e1b9ad53eb2c13b6ece5712f49a5ea739d883c9ce27a7
MD5 078009064f8eb331efaff96171f1ee5e
BLAKE2b-256 f409b5788fb51b4c0fc6b5a6d2a2996f5007a2f3fc14fb3379a71097bfd34920

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7ed1863fe4b596b3ad06ffb2fec008512148aa764ceee59359bda9b53f7e8c84
MD5 efc72ef5418aa7b556531896c4f35fca
BLAKE2b-256 d557819b28bece903e7f44fc9905054d897efeb96c6390a0a9c0a6f5db611152

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 979843bf10b6c15b161c2058955d3f19c3aee76878027937a67a7111842016d2
MD5 3cc3e73f3d3605992a49d6864ddef80e
BLAKE2b-256 1d15bee4f9d8f8643f51ddd984e1b9dfc828d8c848dceb9fff9056e4a9365869

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 ac630d0ce94c9910f8b57ea26d2dc3aca57010e2107933dd4fc02809da6050f3
MD5 b3dac63bfb45f4c3d2edaf8c885cfc09
BLAKE2b-256 c293cd330a86c3dc0aa431b0b7ac180ab1ced44747d47e70518e93515cc5380f

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 85488be9ff2ba5adc993e00af795003cd7f0aaa57e6133d55f0c7811cf898772
MD5 e60254929215744f3328cad72f277cf2
BLAKE2b-256 f9380978fb217e7f06131e26db5b18446e5287a53a0f505149cdafb3a425f4b3

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp314-cp314-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp314-cp314-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 036c6cb6b2100150b58ee6d48851fad7e01852bc7c402190daeeed9163574b77
MD5 45f23d9998bdb6a4a04f9c4f204ec760
BLAKE2b-256 01da6d914325db4620cf2c8ae1d088367141bc9e801aecacbf3b70db74c7ae60

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: granian-2.8.1-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 3.1 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for granian-2.8.1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 83f5ffc52d924185f271ea5e56e36b844ecc918620ba61930e89ebf1d33a650f
MD5 6cc699cb9b8cf948331d17fb9a396599
BLAKE2b-256 1a49ea06d3143a452d4654aaf7808cfc1fe79b0c11abbac279beff5839f40a33

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp313-cp313-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp313-cp313-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 f8f7f1f5a73571a38b6f028278a87d9ce8c56620b7b70bba5b768354cd9786ee
MD5 7a332ed7bbf18cbef9400d4eabf45e74
BLAKE2b-256 c614eaf1925f9114511fcc78582f8f0bd2b1a04ba57f8004c347db7c2d84b1bd

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp313-cp313-musllinux_1_1_armv7l.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp313-cp313-musllinux_1_1_armv7l.whl
Algorithm Hash digest
SHA256 c11f6846cdcd7fa1ac16dc4ee1b8449295d98d425275ddee8f745b9c638d0f71
MD5 033fca1d2e2b19407209ffec1bd2e602
BLAKE2b-256 08750991540f93cc844a9b2d4528f8c17d6b2013881ac69d23e28ec32e383509

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp313-cp313-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp313-cp313-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 d9fc625ba6f9d820fd1c23deb295644272723dc452b7a249edd2c536e66b745b
MD5 e947968b05211d81dfcc702f1995488b
BLAKE2b-256 0a15bca25dbf574ba08a3982d84121a18d8adc95a8547ee72db5188ef93541f3

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp313-cp313-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp313-cp313-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 4364230f54436397bab9bc51de6b4c24680f74361b6ead26dac11eeef44c7add
MD5 f8e88992ee1eebbfce5f207a98bb1fa4
BLAKE2b-256 9f158717de6aec2a5927c68ebdd877008264681600d6e7495511a6d18e066fdc

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e938408f77b8218b7b9b928e347ef3dc3afaa96ea94611c087337560acae212f
MD5 9dea71b27e450d546a14df2903f5d0db
BLAKE2b-256 c35868c3a0331e017148ec4a8a84697b9db2105c4a19b838404b89c1ffd6c7e5

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 5d549e719bf45cdffe5899852b0b4fc8196e4f93f88245e649d47a81dbe26f63
MD5 836cfcbb4fc95e95dac32d95b2e5c78b
BLAKE2b-256 54e5f67d9e8983879ed9876f61c78475dcb19b77f68977000f60babb6c632125

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 037a718b8138808e19d4827f18c3c28d3ae38f0bb070959a93bea587b4eb3dc0
MD5 d54829db8cae3f656bf60b17aa11da94
BLAKE2b-256 5771d7325b977304bf2f9ca12c475c2d54caae5afe7e7ca88bf011dc8c5e9886

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 bdaf976f1d24b4553bee2ffce735b10c1e5e4b12d63da259f75b1dcdea9f2168
MD5 922c186bf08a4bc7d3e453a98185c5ff
BLAKE2b-256 0a545ad6567577ee3b51266fd49f61639a6ae3e1c9cc92d517d9b6ea839be0bd

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp313-cp313-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 904ccbee39dcfdfd6117b868b9e689e20f89ed03952f6bc142fb0111285b9104
MD5 2e3c2f56d41ce987772a577014a78b4e
BLAKE2b-256 6b05a346264b0a00bc1837c995887b801a2792a852aea41cab09e5eba4809da2

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: granian-2.8.1-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 3.1 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for granian-2.8.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 41cc68959ede5094862789ce38fd2f278c8bc6397800cebe1b53d55533b522d0
MD5 c02799684e77139913eed531eeb70b18
BLAKE2b-256 5cf3b426b4ced60ce56459d882a30d6c4cbc747011f83b041ea39ac822bd53b8

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp312-cp312-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp312-cp312-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 80ef39104c26f632ece530a3190e38d510c6a2c583f39dbbd68306d2cc3a2b62
MD5 03a50d7998b33e049d07f4c7fa788301
BLAKE2b-256 5eeca6725637bc519e8a60cdfd109131f6095bea848f614b0aca01c1dff82edc

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp312-cp312-musllinux_1_1_armv7l.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp312-cp312-musllinux_1_1_armv7l.whl
Algorithm Hash digest
SHA256 c9b69d9d38be1111fee8e90099d720f11d8990776d01c4e33a1cc719fff8971a
MD5 a246bb4c3f64abf91cdc3e9b45579e42
BLAKE2b-256 149b0530a3f3b6fe1725aa3c4bc3eafe39f2e32d4ffdb53b4d44d1d37a397d71

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp312-cp312-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp312-cp312-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 c10f438f602c951645dcdcd16f252d6937d1e7f7d79cb4fbfc39ab8c9a2ccbb1
MD5 b01509500c7d0a6f753a4dfb0a069ae6
BLAKE2b-256 494b0daed2ea8b476fdd2dc9b672a172af7ad58e35f74ef6c14e57cf8053d3e4

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp312-cp312-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp312-cp312-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 1a69dab6357ce0dae90c9c93f6f67721c5edb440907646d7c12e6dbcbc5b1aa5
MD5 897b54d8ef59709a5d54bf208d7db414
BLAKE2b-256 d01161eaa3e2a4d53905eb9a9fd76ba310975401ec4fa6d560207c17464f9c24

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0807df2a34f8ee1375cdca6c2a6b8bd3129f45adc90891ee40e84ca4ff23510f
MD5 2b068e5eae7c06cbb2ba2e89bd4880f8
BLAKE2b-256 4e1005ce265cf55d4137e02ff2c51696d656de195394a8c5e2e128e470463b85

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 8f634e6870b80893bfcccf076edd139f508604bc783f71e6efeec8d329034767
MD5 d05bf676d2c885da1754aadcbf523e49
BLAKE2b-256 66b520c34f862c2cad81e4f9e6c53edb8e2d30267b782382d99c7fa15b49d8bf

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 5edf0f35ff158800bbb0f09371e07cfb0036d67c0780a2c7fbbc3b38e131cedd
MD5 75bbc5df89b022941d94c7e5ff45e9ee
BLAKE2b-256 3115076dec71a7951f4b7c5398a2a43ee9703902e408116b4d7238c432296225

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b457cc252cb8a3024491d714bfe29cadf68a9c5d9a2925a8c8dee341303326c8
MD5 632d70daca69702076e34f41bed16d7c
BLAKE2b-256 1a2e45247603569814f3a1ef15cb7edd6f564763ac166a3418996981401da067

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp312-cp312-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 c9762aca1e2801fafb4982716450a275a22f5a737c759dc64c565c0537bf688c
MD5 51b7f43e3447b52bfeac7523376b71eb
BLAKE2b-256 6c96a198179414f84245d9c558d930657e9cdfed632bac1019e8a3d34b9ed1d3

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: granian-2.8.1-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 3.1 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for granian-2.8.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 7cc91c8e619e55afe653b7916bcfa708077ee834fe8fb32b49306b232784f085
MD5 dbbfd14d7815b4363355f008afee19ee
BLAKE2b-256 73525f7dad83f4285c2d49cbe0b6c40a19d7a8be87f6f3505242e6f6a28eab83

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp311-cp311-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp311-cp311-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 db0a2dbdf163318934ee9e6454e895a6411944337a051a4b827125e86b9e5bbf
MD5 f6a36da765bfbb6512e78e1f108dc049
BLAKE2b-256 2df9215ce4cae697dca78fd17d45c6363862e112dfe573f554ae172041f92415

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp311-cp311-musllinux_1_1_armv7l.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp311-cp311-musllinux_1_1_armv7l.whl
Algorithm Hash digest
SHA256 cc05ef1ffbae7442b862e7d176f7b6a13e984c6214b979a5122bdfe0970f8e3b
MD5 350d60a6033a12df111e126465b7cd6f
BLAKE2b-256 a8092f50d644366f5e3c20eac58f46c8af7dc49af39c6da7febcab859df713eb

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp311-cp311-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp311-cp311-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 ae83754640fde4edc6dc23ff725cd33281d2292c4c0e1873744e9fdb5cb3820a
MD5 95758c87cae887b00672c8466cbae176
BLAKE2b-256 a42f3eaf38505ed196ba1b8c10946d98c8b615df0f283d6bf58a6ea183727471

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp311-cp311-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp311-cp311-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 2ad6451f240496657271571f45d6696a2f619d84c19afb0950c7e5a31fd8053e
MD5 e06effd6cd1d544cdfeb3fa0a4412df9
BLAKE2b-256 f398d1ff70c52704d45d82bc03de4517dd4d64ef41f49c1110f115218b314b30

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 bf2963738a74839c9182370991a3b12d18cdb15eb0f3d4ed02d1da21f192ca97
MD5 24a3902c29fc31664a8ae9dc8ffdb944
BLAKE2b-256 7d1c8790fa2083e768ac71538786e50ebeec3b9a1e3f709b3ac117e7de60c2bc

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 1f5fa6f3c16ba8d0954193fa1e52dd668432cb2d2a47347c04c7b8cab8b56fb2
MD5 5f3d6cebe4334738ea100e53b620ff36
BLAKE2b-256 8f44ab53a2a3e965bf43deb223e755f0dd1fdff3792fef18feff466262ee5508

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 9c15fd4f4e781d8067affbc6ba1cd9a5102c34dfcf54399552eff5d25f3eba5c
MD5 65ea458d82393b02fd817302b4a4413a
BLAKE2b-256 f42ffdcee35d536ffe074cef1f54436bbec3bc2932e62f733eb9e13861fc644f

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7c3870288ce61622c7175a66214265eb8491a8f018766aeda216f550c50776ce
MD5 8e1c99794eb047c3911fb2133a5848bf
BLAKE2b-256 be0733071aa60e260f804baf311e8f1203b3b236617a376820260ddf89a50725

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp311-cp311-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 7e206eb8fe0c81f5edf4b8b83790f3908cbf6afa67afd1a0661604b3a804035d
MD5 d7ffe8b79e3cab9ac8229930e515b8cb
BLAKE2b-256 d88bc5ce62d51cc49691e91ca0beb5c30c94c51ad22c7ad9db79f752f3cc0537

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: granian-2.8.1-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 3.1 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for granian-2.8.1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 62f90c06a2264e85a99b06fd903de963240364c1a4bdd0433ef97f844a9e8d03
MD5 077fcd4e04b3f6840fdcea183fde2f3e
BLAKE2b-256 d8496b05091ffb2e54ad60d51acabe4741446e03773ce4891e9234002120aa97

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp310-cp310-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 2bb2213024059d6fbe188feed0ccd55a97b69aa5a1ceaf8a73565fe98c66251a
MD5 842293cfe7e8af07506ffe3213862696
BLAKE2b-256 31127ab00770cccc3243a38c34a5fefcfcb57cffe49412477908d8f6ae746fdb

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp310-cp310-musllinux_1_1_armv7l.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp310-cp310-musllinux_1_1_armv7l.whl
Algorithm Hash digest
SHA256 38ebbe5f08b87a4f4ef31969bbf107dc7c2d1a9194a81b8e8c8c56aa3e1ad115
MD5 1f0115a1c535b0c0ebd2fd5097aa97ea
BLAKE2b-256 8d6b7cb171102ac00ec383f21a9ffef59127075e7f8e04a26d6fbad89ba3e6c3

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp310-cp310-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp310-cp310-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 fa7f4dc9a16061380d263931f03437b1b6197904a7f5bed2220aa6919eddc54d
MD5 62ba856264e187d1f01c7381d390bd26
BLAKE2b-256 19a0d8147435d23cb4e29a0c27184cfb925beb0f28d41df2ea4790051ab5750f

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp310-cp310-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp310-cp310-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 b4742a0c8e392e5b7ac220f6f5d6eb98ef44f6ed2056dc4ffe190c19ab82852d
MD5 c3055b9780d5b786f6462354b10ab528
BLAKE2b-256 f08c412b3179f426137dc56e6f8a6e0588ac9af72e3a9f5f3b93fc7d12680bd9

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 85c33fa1b35a8a36b0e6a48f33dd5fcc9a86f36125921f6c97f5b408c733f748
MD5 a5e91c081134263f409baa4df4ec08e2
BLAKE2b-256 5c2685ce88ce93ab1f8f2f572e092bc2c3d6db9f720c8858b7ef450a6d439bdf

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 be7e870f056b55c0af62f53bd1a979a33ab692cad07ea3b4b9f33415b354f3c7
MD5 157f2f6a59de7367b90b724e4f7ffa53
BLAKE2b-256 76ee6bf0c74361e1af202db470cbdb18a328875b420edf3c65a853b3e7236f1b

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 72a7dee4b3b64754195a35d84150e1ec86f9e9905a551d2cd022b7635bb036a1
MD5 3262d40b90e9901d209d0fcc6a0da0ad
BLAKE2b-256 b8b3c031fd9e68dcf454c806a35b152be51dfa2e84b5f40067528d708c4ab65a

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5fc0a1d00142a0ea429a6610c23645f9b4f40f7996deac0eccf560bbdce8fd5e
MD5 b43b215a9bacc0c0f532bf4946c6f6f7
BLAKE2b-256 0324796b0f17425dd7dd9f26d93741cc528b96ba38cd9fdf0a796106095e8b78

See more details on using hashes here.

File details

Details for the file granian-2.8.1-cp310-cp310-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for granian-2.8.1-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 8bb139f73da3d0bffb6c100bc6d08938fd2b40901f0de88758c00dcda7f24323
MD5 3d7de38fe9d75d7f5171a54e6f13c5e3
BLAKE2b-256 c73885f829ce6491f1e561308e92d96e9019d10aa6677961f8796e867681955d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page