Skip to main content

A Rust HTTP server for Python applications

Project description

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.

Project details


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.0.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.0-pp311-pypy311_pp73-win_amd64.whl (3.1 MB view details)

Uploaded PyPyWindows x86-64

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

Uploaded PyPymusllinux: musl 1.1+ x86-64

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

Uploaded PyPymusllinux: musl 1.1+ ARMv7l

granian-2.8.0-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl (5.0 MB view details)

Uploaded PyPymusllinux: musl 1.1+ ARM64

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

Uploaded PyPymanylinux: glibc 2.28+ ARM64

granian-2.8.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.9 MB view details)

Uploaded PyPymanylinux: glibc 2.17+ x86-64

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

Uploaded PyPymacOS 11.0+ ARM64

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

Uploaded PyPymacOS 10.12+ x86-64

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

Uploaded CPython 3.15tWindows x86-64

granian-2.8.0-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.0-cp315-cp315t-musllinux_1_1_armv7l.whl (4.9 MB view details)

Uploaded CPython 3.15tmusllinux: musl 1.1+ ARMv7l

granian-2.8.0-cp315-cp315t-musllinux_1_1_aarch64.whl (5.0 MB view details)

Uploaded CPython 3.15tmusllinux: musl 1.1+ ARM64

granian-2.8.0-cp315-cp315t-manylinux_2_28_aarch64.whl (4.8 MB view details)

Uploaded CPython 3.15tmanylinux: glibc 2.28+ ARM64

granian-2.8.0-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.0-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.0-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.0-cp315-cp315t-macosx_11_0_arm64.whl (4.1 MB view details)

Uploaded CPython 3.15tmacOS 11.0+ ARM64

granian-2.8.0-cp315-cp315t-macosx_10_12_x86_64.whl (4.3 MB view details)

Uploaded CPython 3.15tmacOS 10.12+ x86-64

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

Uploaded CPython 3.15Windows x86-64

granian-2.8.0-cp315-cp315-musllinux_1_1_x86_64.whl (4.9 MB view details)

Uploaded CPython 3.15musllinux: musl 1.1+ x86-64

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

Uploaded CPython 3.15musllinux: musl 1.1+ ARMv7l

granian-2.8.0-cp315-cp315-musllinux_1_1_aarch64.whl (5.0 MB view details)

Uploaded CPython 3.15musllinux: musl 1.1+ ARM64

granian-2.8.0-cp315-cp315-manylinux_2_28_aarch64.whl (5.0 MB view details)

Uploaded CPython 3.15manylinux: glibc 2.28+ ARM64

granian-2.8.0-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.0-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.0-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.0-cp315-cp315-macosx_11_0_arm64.whl (4.3 MB view details)

Uploaded CPython 3.15macOS 11.0+ ARM64

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

Uploaded CPython 3.15macOS 10.12+ x86-64

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

Uploaded CPython 3.14tWindows x86-64

granian-2.8.0-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.0-cp314-cp314t-musllinux_1_1_armv7l.whl (4.9 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.1+ ARMv7l

granian-2.8.0-cp314-cp314t-musllinux_1_1_aarch64.whl (5.0 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.1+ ARM64

granian-2.8.0-cp314-cp314t-manylinux_2_28_aarch64.whl (4.8 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.28+ ARM64

granian-2.8.0-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.0-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.0-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.0-cp314-cp314t-macosx_11_0_arm64.whl (4.1 MB view details)

Uploaded CPython 3.14tmacOS 11.0+ ARM64

granian-2.8.0-cp314-cp314t-macosx_10_12_x86_64.whl (4.3 MB view details)

Uploaded CPython 3.14tmacOS 10.12+ x86-64

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

Uploaded CPython 3.14Windows x86-64

granian-2.8.0-cp314-cp314-musllinux_1_1_x86_64.whl (4.9 MB view details)

Uploaded CPython 3.14musllinux: musl 1.1+ x86-64

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

Uploaded CPython 3.14musllinux: musl 1.1+ ARMv7l

granian-2.8.0-cp314-cp314-musllinux_1_1_aarch64.whl (5.0 MB view details)

Uploaded CPython 3.14musllinux: musl 1.1+ ARM64

granian-2.8.0-cp314-cp314-manylinux_2_28_aarch64.whl (5.0 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ ARM64

granian-2.8.0-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.0-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.0-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.0-cp314-cp314-macosx_11_0_arm64.whl (4.3 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

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

Uploaded CPython 3.14macOS 10.12+ x86-64

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

Uploaded CPython 3.13Windows x86-64

granian-2.8.0-cp313-cp313-musllinux_1_1_x86_64.whl (4.9 MB view details)

Uploaded CPython 3.13musllinux: musl 1.1+ x86-64

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

Uploaded CPython 3.13musllinux: musl 1.1+ ARMv7l

granian-2.8.0-cp313-cp313-musllinux_1_1_aarch64.whl (5.0 MB view details)

Uploaded CPython 3.13musllinux: musl 1.1+ ARM64

granian-2.8.0-cp313-cp313-manylinux_2_28_aarch64.whl (5.0 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ ARM64

granian-2.8.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.9 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

granian-2.8.0-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.0-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.0-cp313-cp313-macosx_11_0_arm64.whl (4.3 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

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

Uploaded CPython 3.13macOS 10.12+ x86-64

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

Uploaded CPython 3.12Windows x86-64

granian-2.8.0-cp312-cp312-musllinux_1_1_x86_64.whl (4.9 MB view details)

Uploaded CPython 3.12musllinux: musl 1.1+ x86-64

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

Uploaded CPython 3.12musllinux: musl 1.1+ ARMv7l

granian-2.8.0-cp312-cp312-musllinux_1_1_aarch64.whl (5.0 MB view details)

Uploaded CPython 3.12musllinux: musl 1.1+ ARM64

granian-2.8.0-cp312-cp312-manylinux_2_28_aarch64.whl (5.0 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ ARM64

granian-2.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.9 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

granian-2.8.0-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.0-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.0-cp312-cp312-macosx_11_0_arm64.whl (4.3 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.12macOS 10.12+ x86-64

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

Uploaded CPython 3.11Windows x86-64

granian-2.8.0-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.0-cp311-cp311-musllinux_1_1_armv7l.whl (4.9 MB view details)

Uploaded CPython 3.11musllinux: musl 1.1+ ARMv7l

granian-2.8.0-cp311-cp311-musllinux_1_1_aarch64.whl (5.1 MB view details)

Uploaded CPython 3.11musllinux: musl 1.1+ ARM64

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

Uploaded CPython 3.11manylinux: glibc 2.28+ ARM64

granian-2.8.0-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.0-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.0-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.0-cp311-cp311-macosx_11_0_arm64.whl (4.3 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

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

Uploaded CPython 3.11macOS 10.12+ x86-64

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

Uploaded CPython 3.10Windows x86-64

granian-2.8.0-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.0-cp310-cp310-musllinux_1_1_armv7l.whl (4.9 MB view details)

Uploaded CPython 3.10musllinux: musl 1.1+ ARMv7l

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

Uploaded CPython 3.10musllinux: musl 1.1+ ARM64

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

Uploaded CPython 3.10manylinux: glibc 2.28+ ARM64

granian-2.8.0-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.0-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.0-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.0-cp310-cp310-macosx_11_0_arm64.whl (4.3 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

granian-2.8.0-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.0.tar.gz.

File metadata

  • Download URL: granian-2.8.0.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.0.tar.gz
Algorithm Hash digest
SHA256 be842c6737b41beb6fe6521f9c46695a1843ec9e086a18bbbc945ed170ff28e2
MD5 621fdb01c1a8a95974937d4d16626a2b
BLAKE2b-256 5822f289f681277c8a1cd2c29177fc21bad080b270d6b60ac6e91a19cafe795a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-pp311-pypy311_pp73-win_amd64.whl
Algorithm Hash digest
SHA256 3932a061a803ff3441e249895fb080e6b12398a722d895ac6fb4c0f70122cdbb
MD5 5aa6faa7adecf717a42a6a545608153d
BLAKE2b-256 85bb806619a7225c5ed42d980e91809e86ecb1ba7d4b759d83d2758c769329a2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 7fd9c8a78a55d003f36dfb9fbbd8f2369015c5176333449da719e430bcc0e0e4
MD5 3df341168ef1e7ff4dded721664ae1b4
BLAKE2b-256 c79a3033a6c43846895af17fe01a119a6ec4fe1ffea5dc786ca4ddfa8a7c37d0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl
Algorithm Hash digest
SHA256 12cff22f282304378b05095484227ef55199dcb2b413e4a5f1a070c0aa5193f4
MD5 fd004a76a11c026e73e79cbbb84a3d73
BLAKE2b-256 9b3e27d1725cd43e1348b0df74731f6423626dad6f761ec3c5e8057217fbba6f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 5d727b586bcb24a9568fccf37e25ef10c5bfcc2b0401cf1b28d0a570bdc3a4f0
MD5 706f4f93318382027286f6a1761b7b13
BLAKE2b-256 382ee268ec727c3bbc397b731754a3a5f9d48f14d7c2ee13e0dac91149ef66f7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 4df16c414f55eb1324aa5b0f5486ea5aa39cb93e9a49ee15a83df6a987e3c5f4
MD5 ae6a914d7e54e487a7a724d1e919e630
BLAKE2b-256 d9841f77905ad0c4a89cb223793fb57847d4b97a435af63099d8ee98d9364d5b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 007fcd0bcaa9756285b8ad844729af0dedf41dbd6b3df91344f086c6db628ae2
MD5 123a3481098f2138f7535630945b6fe0
BLAKE2b-256 628de13731afb5ccd64256b6d9e3b0147fc141201100d9b3f8336b557396ece1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 018fd40bc1e4c22d367d24df1265f2a349776a20b68b756d4a52107ce8248c82
MD5 adfa841a85c92938e8a661fe1837af59
BLAKE2b-256 3b6fc3aa2246f01fa98ed273c6e0f8f1a90f4b91afaaf6ef3104cf0802b88a2e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 efcb466cfaa76391efe5e0fb336b888aa86eb4b8e6177f79f7a01ffea03a414c
MD5 9471b3cbf711a068cef1d64cacf8e02a
BLAKE2b-256 9e071b6c05cb38172fb9e7c7aeef00be1956f7b7eeb096c4929df6eb58da399d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: granian-2.8.0-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.0-cp315-cp315t-win_amd64.whl
Algorithm Hash digest
SHA256 5c4d67d96ab296164c36ef672a55251ef12c5e4060c1796fcba6c3fd82394d27
MD5 25e1217781144175c1dad166f27dab59
BLAKE2b-256 1f0a711050f09a1b027b13db918e7f272ff5e7f7b4699d9994fbe39f285e2e74

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp315-cp315t-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 0d84b516c3d720d22448d935e136d8ddaabb5a8715bf839d8f28de578d35443f
MD5 dba5d900ac47a61c26673e268042c8a9
BLAKE2b-256 5d502a961f66228426d9c95b4d799f1fea5460f34ea01749108118d81ea33eb8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp315-cp315t-musllinux_1_1_armv7l.whl
Algorithm Hash digest
SHA256 0e96f5bdbbac30e6abff4e7c2268582734ba8a908608c95fbc9a1db5b849bc3f
MD5 ed497bc89ba2f351c33fc1f31eb0bfd6
BLAKE2b-256 da4b01e0f0ad66c886a55c44912385ec72e7da68ece6becf3b67bb402022b605

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp315-cp315t-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 2052d1cf74369430b960f7731db823a1f604e375179182bba3511e88d976eb43
MD5 ee4c755e018b241e4edf0cad95d612a4
BLAKE2b-256 da6e008efb0f414ff7c8c8d0d9112abb5fa9a93574043cbe4e5f69f9ab80caf2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp315-cp315t-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 7cd88ca58924a63eed769ce64cea3c29c876791db14988f2d6f3f6fd5cb18061
MD5 3f180300dd911fe19a1ed4821c291d82
BLAKE2b-256 2f143f635ba0065fc36f7820704059bbc46065dd9e4fae55b28de46a91dff9f9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 04c83c5d7a387635d8c7cde11a95f0babee1cabce3c469de4494a9f93a015394
MD5 ba31f7c78508f870cc3bc609322e1b18
BLAKE2b-256 f98d7501ff01a8ca751608783252729ec067a7dc498c4323ae2e31ac17c1dc30

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp315-cp315t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 faa739c7674c53fb9e6b72500232e6360c13e531d8186cf5ef569ba8ccbd5f2c
MD5 3597244b3b050eca10b27a9740991300
BLAKE2b-256 7672ff6d27931f004e231dcead6c9d5d0c252a73358462885f19e1223784c72a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp315-cp315t-manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 042c177e75a5e67144a39476882ed735ac9558e48097a5658111adbf939c0d1e
MD5 fd723420ad98221cedbd13f0d83f9ccf
BLAKE2b-256 dd8b2f6a7012264011ebe6ea29afdeb333b6c50be3956b70cd59eecf248d599c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp315-cp315t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ca1a764c00b89509eb7a45f1479118481628380e1bd1d94c2248e097abd63017
MD5 dee2a65817c4b13258f53504bf867ae3
BLAKE2b-256 941e81284fa128f77dd6132ed62f29f0a099aec8622f2acd3c3fa7a733dc8375

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp315-cp315t-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 8bf00fd66844846dac9278a15db864ec68c60878098ad638451fc8a3e61f845b
MD5 d9fa63cbacd80543df9e9810f942a85f
BLAKE2b-256 fcd221d2fbf8517b2c0d82bda45dfa7ed26d933a5698ac7107c43da366635223

See more details on using hashes here.

File details

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

File metadata

  • Download URL: granian-2.8.0-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.0-cp315-cp315-win_amd64.whl
Algorithm Hash digest
SHA256 808986933f844f54dd9c6ea47a9e0e39cbbd12b91b315a8de1ea98abb9314e80
MD5 df9a9052f1c92b59e7fae4152aaf8152
BLAKE2b-256 d7a01f2de683c90137ae5a66e89ca7aa72752edb2e0c55490442169007a9bbae

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp315-cp315-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 0d797398949f8de4259926df69d0020b6897ca325672043529d9a6b702bddafe
MD5 1f010f900e64eef5b4e4d06a1ffc6e03
BLAKE2b-256 16ffec09ab42ba46676440715b4810aca60ef92d39dffa68669a4daa0bf01252

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp315-cp315-musllinux_1_1_armv7l.whl
Algorithm Hash digest
SHA256 6f9876220f56a0ffc2bc41a977f6fdbe0458a8559c3f950a0497fe71e52a16e3
MD5 94bf611cc1fb4dcff1360dc2a5c04052
BLAKE2b-256 c8df9afd95c900d0c4fb5d57d1de1d9340cbcad9813b0374c4ac37b0a00c710d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp315-cp315-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 fe48c902ace46e8dfaa24585c2941b51a22b5d77d3676a502ae48caf4ba624ca
MD5 6b698ddbe3fe968d25fd7cdacb0f6572
BLAKE2b-256 2f8e2ed4b28cfb482ccb3e9d6b0812f64ef40598829c53dcca9260aa93994fc5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp315-cp315-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 826bb163325f1bff16f884c98b7f109998a3a9042406c31f7f407114e8196020
MD5 c1339b96721ec642fb926f45ff758ab8
BLAKE2b-256 e517daad58c44a0f934ffa5991440054b738758c645ecd35a8d81266f6bdd2df

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c2fdbbe31574800b2b14dcd2868be06f0e0b333817a37fc0fdae2024de2d4612
MD5 888165879ca935e0ed1c705cf845d922
BLAKE2b-256 0f34760cbeca09daae682e20a6f4a894248edae35dd5e40f27ef6fe8aab315db

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp315-cp315-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 2b771aec7246a9e220f841c24e522f493b67ad2df4a7474e4fa8f960844826c9
MD5 617c94f055ecdefb663e169adc10222e
BLAKE2b-256 d6c736c80a53a43e20e8ecc0587c9b82e0c23ef82b26e258ff05750462fe689f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 8fcd0888e6ab17a14dabd7b8b3a1cda12795a754660279d2b17b6abcbaa65644
MD5 f3ce3b3ff26596e445c02a74e68b36a2
BLAKE2b-256 95edcd6b65766c1f35718fe1d83de985ae79ebd2068ea27ab39457ab95439f54

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp315-cp315-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f956f26d638268312b7cd583fc079cee1bc3474a29508dcb2bf7f797822912bb
MD5 bc1ae4297e643e45d0744f8488efa9d1
BLAKE2b-256 42bd6c62d461da7ccb76ecc57e2e4c29a63fcb55d21a4b04fa030e849e6d0225

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp315-cp315-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 c13e89315cfd91821399c78f1dfe5c63b95cd9b44c9da1052eee66c00e60c719
MD5 6526ddd49eff03580cd3ed6e7c2c136e
BLAKE2b-256 478e264f9215206a177d6a0958ec6a496923c6fa0fca785a350884e9d134fce8

See more details on using hashes here.

File details

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

File metadata

  • Download URL: granian-2.8.0-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.0-cp314-cp314t-win_amd64.whl
Algorithm Hash digest
SHA256 9383c97c12829b0b0accb3aad5011ad765e74a90d54d8381cf722ca4f7bdfc0a
MD5 ebc9d6fcfbae17ba789db86d66139f41
BLAKE2b-256 b28e76f58b9953a1aa1ba317ce0d96073a47dbb515d562fa524ea8a6b9564bc7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp314-cp314t-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 7d516e7ae705e0d5f8ece085ac18b8817dc4c8adfb7f0f68e9ee529e991664b2
MD5 e5b94be0b7471d8f47d4ab856346d04b
BLAKE2b-256 417047897e417dd22c83e731d85e8f388ed29a1b88a97404063c05a2510fc11e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp314-cp314t-musllinux_1_1_armv7l.whl
Algorithm Hash digest
SHA256 7b76586d95b798453ee89304a1bb25b1ea9301f564cd3a6a20268b8139a9cad5
MD5 94b8b8c4e9b5c8e50acedbba1564f055
BLAKE2b-256 6de198b97433013a1219ed1c1238befa7aa0eb83d7bbc872e63193e847e152fe

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp314-cp314t-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 ec5281054da6e342e7be3d3d5bf764288faa2e6407d26ef5b9a909fa5b5ca44d
MD5 e05c9e38193087d5eed30bae179356ed
BLAKE2b-256 1735d5f6e690eecdf4a63460d65f363527fe3db69477bfd0df631f395c554a4f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp314-cp314t-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 6c1aeca05c84434ecafb2297aabaaf1e39a267e66eee4420b7669cf0c47df369
MD5 819f1ba87bec8a06a0e2c9bda26f881c
BLAKE2b-256 c08342aeb107969349a07b7385dda0222fad830d318f1d5bdca084823650f859

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6bfd4726c4c61f39dbdb4e4e2bfe8fd0ace2cea58eb34ce720036e8e09b1c27a
MD5 29d89e98f9e69d09c4dafc1dc51d7a27
BLAKE2b-256 366e99b59975f249faaa066320c4f2927102c6740de87be8421cae99c47688d1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 81e12dcd0b504c8704b54c6a88733a57de21726ee9567a018f8cf7972e190753
MD5 c1065841274dbb2c14b6492c94bce482
BLAKE2b-256 ba0935c8b5d5001ec3024a1bef4c6305582cb5e8f8a2f2e85f90eead59910593

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp314-cp314t-manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 640003ab77b6dc29b0c247cdb8d970cb2f4986de2e7c72849e9f5fe565eca18e
MD5 868d3f87f4582655cf2d8104c11f95a7
BLAKE2b-256 7b1cda817b9cf934fb041ae423744a1c89823af3299f91c2569fa04b4cd0f3b7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp314-cp314t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4c228897c11931c623ee27e07ba512a86667d7c7af0172c4334ae8a0dc66c6f6
MD5 c8c807a0c8ec1cd5032b6f3cf9b84d6b
BLAKE2b-256 4dd44bbb6b1d9c56c9cb5ce636fc3c2d31ec0baacf6975d379b5ae4ab2c3627c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp314-cp314t-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 a3e0905fa79ab2b5752e9222fb87003b1e69f7162eebe6eeec0ab924e5e67312
MD5 01f6c7f20245aa8fd3f26a59b72a1e1d
BLAKE2b-256 b69364cf513a32fa2f64a421b58b0b00486d03e48cdd69c367ce185140e00f62

See more details on using hashes here.

File details

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

File metadata

  • Download URL: granian-2.8.0-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.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 dca589ddf61239e08a52ec6fa7f62290cd9ab707588dc928d9b65df971ef202c
MD5 345eef13e1eb45d7b694b5b1cd5e9988
BLAKE2b-256 eb40965f20eb6cedc318d08c361fcc8b3c85efac3aadf5adf298b32f6075ebbc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp314-cp314-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 de30f61a321571cfaa7ab1650f324b26959fce6826d341bae520cf2786368a09
MD5 326b0c8808e56b5982b48a533f9731e5
BLAKE2b-256 a6dfe832f520be4c3439148ea13b8c5b635297138bc572115284b55c4425343f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp314-cp314-musllinux_1_1_armv7l.whl
Algorithm Hash digest
SHA256 1bb0c4c2ac258f5e96cb5ea1d1c674c3d1b7c7bdf110ae97bae173bb003405e4
MD5 81131eaf5562aea9b6b494239504bd1f
BLAKE2b-256 ee7b0ef38e58546d757c12d751bf8bc9ab3b16287d6cf09656ec6d53874b0ed0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp314-cp314-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 09c73e7835a7bba35f14320b8e57dac1da4981c8c6d3a08cd6e9c557860bbb1b
MD5 ebb0f6d7ed8d25ca22fd63f426ff9640
BLAKE2b-256 8ed4adcec457beec4f2775ee3cc5d4ac43c795edb0adf104cb48d9d1181b0924

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp314-cp314-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 35624cf9fe8bbb416890871e63de7f3460555ed9bf0ac69b533f796a4382a746
MD5 63a0dee62250b0f5c413409bb3efb810
BLAKE2b-256 d4eb3b140540414e540a2708a4008eabfe3958c2b010ca998738fe6173300f9a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 036eac55cb9d67457b50b86a1c364d39c3f0ce4e06d86a87d3af8de7d173e721
MD5 fccc99f26a21e1e18b339044adf7b430
BLAKE2b-256 eabe9eedfbc98b0fb6f0213adc0338d530467cd1acaa98aa026fab881c672a8f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 9cc2f421b899d3a8615ae705016f41a6e0a4940c7005dbf58fc8962a412bd760
MD5 b751bd90f55a4b51f32a1e2fc3c559fe
BLAKE2b-256 89c67e24caa2211fc669076aa223867e2bdb3f0a5bb9d74bbdbe9cfb4c8b5d9a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 36a53d61e6d5f04af257700d2b83700d64be5f392d0d07a2cb568daa2f778c8e
MD5 ffd51c159047780d14a3fa87b070661b
BLAKE2b-256 e132846784ed1e3b7aa84e473268a9c43cfd2c5b97cb9dd0161e4719e04ecf53

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 95517d0f5c38cbed7b94a6d28dfb6710330b879024a9ee73dacf6b4ade638925
MD5 3332d6e94d70ec79f2248e8b56c8919c
BLAKE2b-256 693739b99ffff95b9cce64c9964ff21f15e75b3b5c96f0529b56ecd87a8df037

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp314-cp314-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 55aad6e52f7b5d22c468304f5862b154e08ff231c622e956d63f4b5a7f308e36
MD5 eaf4aa2e4e0146ccbda3e6892e79e3e1
BLAKE2b-256 dc101c8231d6592bce2855d002c0b82939c62bca317c82cf37ac98ed219b94d7

See more details on using hashes here.

File details

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

File metadata

  • Download URL: granian-2.8.0-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.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 a1d8dce913504188d4fddb12e33515ee5bef6c4658e9eabb0bd5dd43d9c1e4de
MD5 783668b20720a1232dd7a14d45c052c8
BLAKE2b-256 687b5d5b9b3b02f0abe30496ad3cd7123221666fd54b0a3a3d9fa3a18c66de51

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp313-cp313-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 4f4fa63ed4fe67ec12f9a26d29779f52c35cbc8c57fe337f7bea25f8c47981f6
MD5 3124a05351e777c39de3f8307833fd2b
BLAKE2b-256 11a3aae60898ffb725ebc7f2caa5055d1aa4c6aa49c8ba29dea9f559e2eeea3a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp313-cp313-musllinux_1_1_armv7l.whl
Algorithm Hash digest
SHA256 67c1db11193797fe1de61e74ac858fbac4e4d27f1b8c4b437be40b15700fccf8
MD5 2bf602eff20c46d021bb193f7f5e1654
BLAKE2b-256 e309025227fb79b3b7bcfc810922863fdbc05bf3932030d207773bf2bba5bf60

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp313-cp313-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 39b620297be07d71ff92aaf2c52f5a376a7888d251a3e953cad81620751ee0a6
MD5 c5a6b4d78223cc2cdb1fe154519c798c
BLAKE2b-256 061e42d540dae26873938dbc19cf0d692b9644c8d8a6aee668fa78c79f751897

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp313-cp313-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 6ebfd8af38136054e6ea2e86b18649c5676d924fc3a40383ebbb3af6185e929e
MD5 48e75037a963e2dd782fbe7a8bdca0af
BLAKE2b-256 23fd10345aabf40982f9483671c93be9a1892ece07ca3bfe68babc4171caa946

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 682a63cb450f71760a56c80794c0c49bc638d58f8f4e9f91202a21c08014994c
MD5 11c97045ab0a1ad45103eb8926273bf4
BLAKE2b-256 82f3bd62b2c9830fa3bfbfbac7e07ab086a0f0b3e5ab6613fcf017a389f975ef

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 f03da08e21e6d0a6b0ac6be3dca4485e2ec1a609e9349e07c390c745f0c8b29c
MD5 8b0f8ebfcd2981b8ec28126e483ee0da
BLAKE2b-256 a8f34971ab3775153452940c1f38dff2a141168dc2bcffb4348382ed47fe828d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 6848acafe50547b2f6c3f5d92b5a3d873dff97267287195a45f18a9270ca2952
MD5 fc5f1f0c89fd8954fa80dd3a7be79e07
BLAKE2b-256 bb03740fa22bdbeec4fa55cf017956955532ba760584a9479690442e1c831179

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 bf3ed0a22327aeb1b15e36c3d56c2174a68a0dd6a57554ac5b7456fd231e258a
MD5 c434960a38c20fb5673f603f9f6e96b8
BLAKE2b-256 281be686b7504e125a2dd5757f2b668c0ef4707467d04add2e42cfa9b19f9139

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 9e28aa83940629169986615ecbcc39c026e193df41ba8264202fefba5edaa8b6
MD5 1bed8a136fb57e04e5d28f9835c68a57
BLAKE2b-256 95451c1f3b80b19813a8c3f025397aea4b56b62d2d422100b10498a7f13bcf35

See more details on using hashes here.

File details

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

File metadata

  • Download URL: granian-2.8.0-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.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 471e4d122518ca23776677bcd104c37bdf31377a4a8b8c668e3d6551e90213bf
MD5 02e065a61b2c6bf3d4b8b608f048370c
BLAKE2b-256 bc2f0b4e8a671e52b868140a80b67ddf665aa85622114a2dc28dc550119cbf49

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp312-cp312-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 49bbcf8c20370cba6d0d5ba1aac95f5e9d22a3e95b10b420d49337629d2f4fcc
MD5 a6a6aebc436f162589cab026194ae8dd
BLAKE2b-256 18b71ee1f572b86c5681387ca10e10750c3d35583db43aa85213bbc33f2cf6f3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp312-cp312-musllinux_1_1_armv7l.whl
Algorithm Hash digest
SHA256 89d4904bb657503ab41b304340c42371c9f9b01f83b6c7c136f5a0d8bff50efd
MD5 14f6de57b7fc92880453c35087df5af6
BLAKE2b-256 bc7b55fd1dca67c273460fe13f622cfbcf17812b27077656bb9c7982b88e9d31

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp312-cp312-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 67e1f73705aac805ec1e7e10c38946a4dd49f26e018d250014d1fd9a924dca64
MD5 dde5a5395e9afa16fe990dc50e7143dc
BLAKE2b-256 5a14d4624e7c22c7b26d1ba0e296a6c25621a6daeedd09a1399fdf9c34e2e8ec

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp312-cp312-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 5827ee36b7e5af4a104430d802cc0454913dd2f984b0b594c42ba049a1deeb61
MD5 faac2801ffedcb308c4784ae6399c0a0
BLAKE2b-256 c42e5124c9c4d66d3e8405f3cc5fa4074d06a703546456c002587af9d3c2822a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 278db6788bacb37e9e57abb429229f74c5b5f6f5dca06f66fad027a4ff6dc51c
MD5 59fc6316230fe507b641011731d1bee1
BLAKE2b-256 95878f9e929ac017233ce14123601765d095305b407df0a512ae8c14ea741380

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 899b1af43754ee8ef6beaece26947cee3fa03487f0193d5fc17fb55435903a68
MD5 bb09364200db72f139d7854e3b3c15b7
BLAKE2b-256 9300a2dd16309d39be4888fe90da677692f0148feff589438b536425ffd3d3de

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 edca648754927c913dfcf52068b96418b66810017fd628d19cb1b65f78dfd9a6
MD5 5f3c787695585dff4d2958ed6f8b952f
BLAKE2b-256 18635245e1d11a3920b1d7705d6748e736b07a48f1415817a2b7b0eab921b26c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 76fdd00bb5842a7993ce57e7d254e75d5e9d7425b49d02a341b93d618047f1fa
MD5 3fa03e13296b53c99f63c96e3aa0e9ca
BLAKE2b-256 2da5b7835933f999a73d8fd5b15f6734f6abb40edac4d759b2490a069762c1ad

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 de8fc64f423f000a0097886e0c4e8ae1bfb4b4d0699edc6244da768c05c0b40b
MD5 e607d7fc9feed2b28a20da8e8cf67d0e
BLAKE2b-256 45ab432706e82c0bb95ecaf9aeee26d36c13b2917a358377ecf07675b363d61a

See more details on using hashes here.

File details

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

File metadata

  • Download URL: granian-2.8.0-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.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 1fb070bf50122353e316692927dc77e2fd84fde5bd17e89d83d66c3ad4b39809
MD5 f998d3416c57155c8744b3e30840797b
BLAKE2b-256 2a1ccec72287bb2d313e74cd8a99140689151bd8eafe628276ad9035433da5ac

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp311-cp311-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 31d424ca1fd98381069e5bf684bcb78d0dd906ee20383e48a46fcb75c6bc4dc5
MD5 c3547652ff68f1ae0c2eabfc2144e7be
BLAKE2b-256 27dc1b865720bce1fd33283e478d3151aeb01e74babcb02b3fcaa4bc0da069ba

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp311-cp311-musllinux_1_1_armv7l.whl
Algorithm Hash digest
SHA256 58f97da58709a017c10564a5472854696a27278ae92083f65937213609b7e667
MD5 ebc21ff3723c5eb881a6e294f9a41794
BLAKE2b-256 dca6eaa2ba68ada39123b9c083247536a006ccc3684c479644701b48e295d43e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp311-cp311-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 2c4c3982cdc2e07db7b85bc421632b4cbf9a3855dc02eeb1300c6488126b9cf3
MD5 ac8126bfa238a2ec0b2153fae754f151
BLAKE2b-256 92fb4d805d1847d737c5f70c8ee916e439da6b801356371876dcb0a4eeab4231

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp311-cp311-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 df76b03542b0f9ad67c0ac6f927faa1c4a029ea001be97fdcc5d03bbea617975
MD5 621f7f309de7d34263d4c3b2ab8e9391
BLAKE2b-256 273aa65c17a8caec6ad567c4ede495ab744ed6849a3a079657edc919dfb2cf1b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 42ffef3148f6d7387182fa088834a4ffdf48d1de42c2e61fb961a8552eadb667
MD5 c24f532b440307f6ebb339a8810eceec
BLAKE2b-256 f87a41772d8980a33383f9c47b6cc5a9e2c2266928abe82734e83d72960f6830

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 87dbd544e41074a5b2b4d6ba82b1c8172c164bfc4543819f41161ad1222c4799
MD5 b2166a5d7fa7a243236ace7ca79f95d5
BLAKE2b-256 58230b1e5beedcdefca60314d869f7e8eb25da5e741328ef31a58f1b5467fdba

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 10889fbe3a46f65184dd877450ba07fb653def537246bdc5c135c5eb17619388
MD5 62ba0cfd7b8e9721362880d7ac38a029
BLAKE2b-256 a6afa74dc0a2699b07ece151fd6d9a5ff151eff70254b7cde49f8039034a3e00

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7990e16ada156dc8dd66c8bea4688cbe14fc013e10ab8f2d554936a1fe9ee14a
MD5 35667918d7f18304b93257070e628bc8
BLAKE2b-256 6c2eafa50e6bf9dace1dbc8ec814e2a251fc0fc09326590b90887ee9e3d1a017

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 ab31b4205991954dbc6ccd8ab243f4b141a50da695bf2d9de46e56bec99bc0cf
MD5 578f71b4125f4c860e1aeb96281134c3
BLAKE2b-256 9f54a18bbca2647d2faa720da32cd7e339356ab0a2dc4ec7243d015ee6a97b50

See more details on using hashes here.

File details

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

File metadata

  • Download URL: granian-2.8.0-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.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 7859a14bcf7b168b2e6560c00e7cf3905cc5d811dac24107e37378555c33c248
MD5 3dfa41b879ec676fc159806a1601054a
BLAKE2b-256 537e275586f97049f548e78559d66c44785a9636e2d44328f49c764d58437725

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 c0528505f26a31cb1c2f3cf013037bd58dedbf98f88a7932bbf8be03e83d43b2
MD5 dcfea235416c04cf4e3ff9917640b514
BLAKE2b-256 d69357690f11fdd5ce4690fd8fa399bf22029bdcad88cb6785b3012836726bbc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp310-cp310-musllinux_1_1_armv7l.whl
Algorithm Hash digest
SHA256 6e9a4bec64249af5c6bbe6f12a7753c8449c213bfafda4442fa297ffbbd2028c
MD5 242339e065b964385ad68a90b7df551c
BLAKE2b-256 31f844afe74abf0a9dcc0d15d1511c3b1108551acfd9e7dfafff6d07caf48982

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp310-cp310-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 554949ec0c56a5de8e62d5f9e50f987214595a0e861cf60a3fff6c53cca76632
MD5 018dfdb290572b8274c9160741a15413
BLAKE2b-256 c157b6e1169bd769b10a946634650b9d28e15d84b928d2ebd4428ee3a14e7a5d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp310-cp310-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 976264517efde93c6f9b0d1de185038de7a9ee22280114b4d0824a49243fb79e
MD5 c79637f599ea4fc9a188d27ee7d06b7e
BLAKE2b-256 18f442dfc71502ed16eab00b970a047e3886927668f63209d38f8a46dd19ae9e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c3a2b46a1ff2a2e32d85e5d73c70d3f3c298e4ef8a4d6f92c9d384a7dc489ba8
MD5 47cb3c9f488ff41370d0b670f656dc12
BLAKE2b-256 0288f8f1239e1f477a0bb39de37dc1ffe03a588c1f507139be49327626037a11

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 f2793ad9302077020bce1ae6ecdac0a130e89c59880bc52fde6413cb90fba9b4
MD5 c16a3540aa3d94af7aa2e76231a411a1
BLAKE2b-256 7126a627f837fdf28a2666666e793aa8e542e069f852265eb999557da1788936

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 a5f77fd36e1247c07422edc1bb0eb75b0249893fc5e8ddf8a3c22ebfc8f5872d
MD5 358b4ee43d0dd2f5c95f1a1360dcd974
BLAKE2b-256 a95006db2a93c4479ba79dcd4d8aa1023e148d6057e125022910527c7a3af7c6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9ceaba5e33b701e39c5c3f8ec5fdb498ca10975673544503ba94b1c3c9a77d4c
MD5 97099954a78cb216f54c08069b0e987e
BLAKE2b-256 60f2be56c5c59ca9fb3415cebea005c219561cc31c226f875024631cd700aa76

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.0-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 34f470790a0ed3be3626e69cf4b8d2e8a5cfbe443a33c60cead3121c2caa0fb1
MD5 517e29996271190ef295aaee4d067df3
BLAKE2b-256 fd01e0f5a01d4f4251ffe60a8b261f276aaa6ef542cd6d60dffabc519bccf8e2

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