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.2.tar.gz (129.4 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.2-pp311-pypy311_pp73-win_amd64.whl (3.1 MB view details)

Uploaded PyPyWindows x86-64

granian-2.8.2-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl (5.2 MB view details)

Uploaded PyPymusllinux: musl 1.1+ x86-64

granian-2.8.2-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl (5.1 MB view details)

Uploaded PyPymusllinux: musl 1.1+ ARMv7l

granian-2.8.2-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl (5.3 MB view details)

Uploaded PyPymusllinux: musl 1.1+ ARM64

granian-2.8.2-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl (5.3 MB view details)

Uploaded PyPymanylinux: glibc 2.28+ ARM64

granian-2.8.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.1 MB view details)

Uploaded PyPymanylinux: glibc 2.17+ x86-64

granian-2.8.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl (4.5 MB view details)

Uploaded PyPymacOS 11.0+ ARM64

granian-2.8.2-pp311-pypy311_pp73-macosx_10_12_x86_64.whl (4.7 MB view details)

Uploaded PyPymacOS 10.12+ x86-64

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

Uploaded CPython 3.15tWindows x86-64

granian-2.8.2-cp315-cp315t-musllinux_1_1_x86_64.whl (5.1 MB view details)

Uploaded CPython 3.15tmusllinux: musl 1.1+ x86-64

granian-2.8.2-cp315-cp315t-musllinux_1_1_armv7l.whl (5.2 MB view details)

Uploaded CPython 3.15tmusllinux: musl 1.1+ ARMv7l

granian-2.8.2-cp315-cp315t-musllinux_1_1_aarch64.whl (5.2 MB view details)

Uploaded CPython 3.15tmusllinux: musl 1.1+ ARM64

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

Uploaded CPython 3.15tmanylinux: glibc 2.28+ ARM64

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

Uploaded CPython 3.15tmanylinux: glibc 2.17+ x86-64

granian-2.8.2-cp315-cp315t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (5.0 MB view details)

Uploaded CPython 3.15tmanylinux: glibc 2.17+ ARMv7l

granian-2.8.2-cp315-cp315t-manylinux_2_12_i686.manylinux2010_i686.whl (4.4 MB view details)

Uploaded CPython 3.15tmanylinux: glibc 2.12+ i686

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

Uploaded CPython 3.15tmacOS 11.0+ ARM64

granian-2.8.2-cp315-cp315t-macosx_10_12_x86_64.whl (4.5 MB view details)

Uploaded CPython 3.15tmacOS 10.12+ x86-64

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

Uploaded CPython 3.15Windows x86-64

granian-2.8.2-cp315-cp315-musllinux_1_1_x86_64.whl (5.1 MB view details)

Uploaded CPython 3.15musllinux: musl 1.1+ x86-64

granian-2.8.2-cp315-cp315-musllinux_1_1_armv7l.whl (5.2 MB view details)

Uploaded CPython 3.15musllinux: musl 1.1+ ARMv7l

granian-2.8.2-cp315-cp315-musllinux_1_1_aarch64.whl (5.2 MB view details)

Uploaded CPython 3.15musllinux: musl 1.1+ ARM64

granian-2.8.2-cp315-cp315-manylinux_2_28_aarch64.whl (5.2 MB view details)

Uploaded CPython 3.15manylinux: glibc 2.28+ ARM64

granian-2.8.2-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.0 MB view details)

Uploaded CPython 3.15manylinux: glibc 2.17+ x86-64

granian-2.8.2-cp315-cp315-manylinux_2_17_i686.manylinux2014_i686.whl (4.6 MB view details)

Uploaded CPython 3.15manylinux: glibc 2.17+ i686

granian-2.8.2-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (5.1 MB view details)

Uploaded CPython 3.15manylinux: glibc 2.17+ ARMv7l

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

Uploaded CPython 3.15macOS 11.0+ ARM64

granian-2.8.2-cp315-cp315-macosx_10_12_x86_64.whl (4.5 MB view details)

Uploaded CPython 3.15macOS 10.12+ x86-64

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

Uploaded CPython 3.14tWindows x86-64

granian-2.8.2-cp314-cp314t-musllinux_1_1_x86_64.whl (5.1 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.1+ x86-64

granian-2.8.2-cp314-cp314t-musllinux_1_1_armv7l.whl (5.2 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.1+ ARMv7l

granian-2.8.2-cp314-cp314t-musllinux_1_1_aarch64.whl (5.2 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.1+ ARM64

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

Uploaded CPython 3.14tmanylinux: glibc 2.28+ ARM64

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

Uploaded CPython 3.14tmanylinux: glibc 2.17+ x86-64

granian-2.8.2-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (5.0 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ ARMv7l

granian-2.8.2-cp314-cp314t-manylinux_2_12_i686.manylinux2010_i686.whl (4.4 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.12+ i686

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

Uploaded CPython 3.14tmacOS 11.0+ ARM64

granian-2.8.2-cp314-cp314t-macosx_10_12_x86_64.whl (4.5 MB view details)

Uploaded CPython 3.14tmacOS 10.12+ x86-64

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

Uploaded CPython 3.14Windows x86-64

granian-2.8.2-cp314-cp314-musllinux_1_1_x86_64.whl (5.1 MB view details)

Uploaded CPython 3.14musllinux: musl 1.1+ x86-64

granian-2.8.2-cp314-cp314-musllinux_1_1_armv7l.whl (5.2 MB view details)

Uploaded CPython 3.14musllinux: musl 1.1+ ARMv7l

granian-2.8.2-cp314-cp314-musllinux_1_1_aarch64.whl (5.2 MB view details)

Uploaded CPython 3.14musllinux: musl 1.1+ ARM64

granian-2.8.2-cp314-cp314-manylinux_2_28_aarch64.whl (5.2 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ ARM64

granian-2.8.2-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.0 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64

granian-2.8.2-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl (4.6 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ i686

granian-2.8.2-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (5.1 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ ARMv7l

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

Uploaded CPython 3.14macOS 11.0+ ARM64

granian-2.8.2-cp314-cp314-macosx_10_12_x86_64.whl (4.5 MB view details)

Uploaded CPython 3.14macOS 10.12+ x86-64

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

Uploaded CPython 3.13Windows x86-64

granian-2.8.2-cp313-cp313-musllinux_1_1_x86_64.whl (5.1 MB view details)

Uploaded CPython 3.13musllinux: musl 1.1+ x86-64

granian-2.8.2-cp313-cp313-musllinux_1_1_armv7l.whl (5.2 MB view details)

Uploaded CPython 3.13musllinux: musl 1.1+ ARMv7l

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

Uploaded CPython 3.13musllinux: musl 1.1+ ARM64

granian-2.8.2-cp313-cp313-manylinux_2_28_aarch64.whl (5.1 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ ARM64

granian-2.8.2-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.2-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl (4.6 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ i686

granian-2.8.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (5.1 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARMv7l

granian-2.8.2-cp313-cp313-macosx_11_0_arm64.whl (4.4 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

granian-2.8.2-cp313-cp313-macosx_10_12_x86_64.whl (4.6 MB view details)

Uploaded CPython 3.13macOS 10.12+ x86-64

granian-2.8.2-cp312-cp312-win_amd64.whl (3.2 MB view details)

Uploaded CPython 3.12Windows x86-64

granian-2.8.2-cp312-cp312-musllinux_1_1_x86_64.whl (5.1 MB view details)

Uploaded CPython 3.12musllinux: musl 1.1+ x86-64

granian-2.8.2-cp312-cp312-musllinux_1_1_armv7l.whl (5.2 MB view details)

Uploaded CPython 3.12musllinux: musl 1.1+ ARMv7l

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

Uploaded CPython 3.12musllinux: musl 1.1+ ARM64

granian-2.8.2-cp312-cp312-manylinux_2_28_aarch64.whl (5.1 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ ARM64

granian-2.8.2-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.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl (4.6 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ i686

granian-2.8.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (5.1 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARMv7l

granian-2.8.2-cp312-cp312-macosx_11_0_arm64.whl (4.4 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

granian-2.8.2-cp312-cp312-macosx_10_12_x86_64.whl (4.6 MB view details)

Uploaded CPython 3.12macOS 10.12+ x86-64

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

Uploaded CPython 3.11Windows x86-64

granian-2.8.2-cp311-cp311-musllinux_1_1_x86_64.whl (5.1 MB view details)

Uploaded CPython 3.11musllinux: musl 1.1+ x86-64

granian-2.8.2-cp311-cp311-musllinux_1_1_armv7l.whl (5.1 MB view details)

Uploaded CPython 3.11musllinux: musl 1.1+ ARMv7l

granian-2.8.2-cp311-cp311-musllinux_1_1_aarch64.whl (5.2 MB view details)

Uploaded CPython 3.11musllinux: musl 1.1+ ARM64

granian-2.8.2-cp311-cp311-manylinux_2_28_aarch64.whl (5.2 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ ARM64

granian-2.8.2-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.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl (4.6 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ i686

granian-2.8.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (5.0 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARMv7l

granian-2.8.2-cp311-cp311-macosx_11_0_arm64.whl (4.5 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

granian-2.8.2-cp311-cp311-macosx_10_12_x86_64.whl (4.6 MB view details)

Uploaded CPython 3.11macOS 10.12+ x86-64

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

Uploaded CPython 3.10Windows x86-64

granian-2.8.2-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.2-cp310-cp310-musllinux_1_1_armv7l.whl (5.2 MB view details)

Uploaded CPython 3.10musllinux: musl 1.1+ ARMv7l

granian-2.8.2-cp310-cp310-musllinux_1_1_aarch64.whl (5.1 MB view details)

Uploaded CPython 3.10musllinux: musl 1.1+ ARM64

granian-2.8.2-cp310-cp310-manylinux_2_28_aarch64.whl (5.1 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ ARM64

granian-2.8.2-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.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl (4.6 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ i686

granian-2.8.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (5.0 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARMv7l

granian-2.8.2-cp310-cp310-macosx_11_0_arm64.whl (4.5 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

granian-2.8.2-cp310-cp310-macosx_10_12_x86_64.whl (4.7 MB view details)

Uploaded CPython 3.10macOS 10.12+ x86-64

File details

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

File metadata

  • Download URL: granian-2.8.2.tar.gz
  • Upload date:
  • Size: 129.4 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.2.tar.gz
Algorithm Hash digest
SHA256 466a23e8cb44d4b407fa3db0f37aeb45ae722cad4d4b3701d6fa6b13ca54b1ef
MD5 5bd56d80d233f151f375905b5bf46180
BLAKE2b-256 80749903bd396a3ea5e40163ce4946df974bfb9f7280834b1c59d727df65867c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-pp311-pypy311_pp73-win_amd64.whl
Algorithm Hash digest
SHA256 f5967b021e36448d870012c0853342a119d7427ea67e3b23abb8798897bf14be
MD5 4767a0f73b66740478318e026d71fbba
BLAKE2b-256 8b6a0d333d1e2433348bcd87d0d0281c6c4abfe2a66a24c90180faa15597b7b0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 8475e23ea2aa9dae4bac28f3ccae403e2cd07c36162a2b4a2bf8dbe43cf28509
MD5 43a0ea441f98fb8ceceafdd6e945b517
BLAKE2b-256 9b9ba2071665a342905dfdacfd774e21cf380274bc0c4da95e249b5c7b5e136e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl
Algorithm Hash digest
SHA256 77dacca3c0a858b958a7442557652d182f985a3b335f43d22e65d46929975f22
MD5 926e8efd2e98d359c6bb154729b9d035
BLAKE2b-256 8097020970b6a28ce1faaf7867ffb027d46bcd9d52352a27e6312c517525fff0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 dac13e7f83f797e9a9106ce6d6e0263a65962188ceba74326fcfbe1d485c658b
MD5 b299843e932aaeb586a62c04103944e5
BLAKE2b-256 496994ba53cc13222b54747b8aedf60900d776f077548ff44749b04aa6ad859c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 5e70dd701be4263c6b2b2f16094bcb6f6ed03fe7782165e40f850fb746a109b8
MD5 38c3504a11325a50751173a8d7998c53
BLAKE2b-256 a056b96f84606653875cff972d418514079e634613be9845a22213045de63054

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0310c68d288b7892d0ae852ec0c5e1e894a1c642deaca1e07ca18960e3336851
MD5 1bc65c8db1eff9d27cf813239d844402
BLAKE2b-256 836fb4453648d3e3a812d757dde46d7fa5264b5ff5b16f1b8a6367cdac108cae

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 42be026b47f8bc6beda8ce01a8a193e297a93b62613340a746a06a8a17751a81
MD5 4247eebe3d7bdcfdb4b431c20b76ea5a
BLAKE2b-256 5ce6e8195bc4847cef39cb335bd75c440c11c13d80c6dbd7c19cb59a09d75dee

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-pp311-pypy311_pp73-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 d275ca1b6dafde6807a5b1baece9f49ecf63c2cb744f61e774800c07cac78d0d
MD5 6fb2f17d71ccbb24e534e8d86fc91254
BLAKE2b-256 9d378e8a304527630457e8045ffa904864ddbeaddef7482b9681973302752151

See more details on using hashes here.

File details

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

File metadata

  • Download URL: granian-2.8.2-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.2-cp315-cp315t-win_amd64.whl
Algorithm Hash digest
SHA256 c4047b3dd1b581b56808a8a5e6932bb246c81cb7de3b5eeb82b2fca23233f6b3
MD5 d8f4b04aafc4479f417d143d4984895b
BLAKE2b-256 f5940097b0b7214cedb8d39f2dc6f571fcb9b478148a11b6f6cda8ef2dda08ef

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp315-cp315t-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 587f1121c44cab7df8d71b3f9bde0ac90d603096685ba212a4e193ae6fd2209c
MD5 320854287b7c64d1e190d4aa3b68a284
BLAKE2b-256 e677cb8b3de1a9e33e0f9b17b74a594377c9600348758f051a2b720a82665643

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp315-cp315t-musllinux_1_1_armv7l.whl
Algorithm Hash digest
SHA256 214d4e1b7353216e3ec16cc49d8eecb29e8949ae6e2a815891250465b7c3b0f5
MD5 c6140f637c80d77ae623c9684267441a
BLAKE2b-256 d5b40af0d59f172dfa6e56c55911e6461d7fff0d088268e02cef5e9598a9143b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp315-cp315t-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 956968b9b32a74eaade95502c1664038c978731c17bb2c4e039bbdcf0279653a
MD5 719df6873c3a8dcbcdd30c97add0a12f
BLAKE2b-256 f448ae77db1206b2409149b4a96192354250042a7664b412346d3e5b6824665c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp315-cp315t-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 39fadbc69e5279d1b5181411d80239a0ffd1fa75422903fb97e871545c8edb5d
MD5 5f5dd2a2f1f749305c8e8a558fe1b71e
BLAKE2b-256 34536e2539b4c667cbaceea672b2080cc7093f58b7274c787a49c17e0b086bdb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c3e58821fce2fa93406bba043eac6a8c24518e63d9ead044623d1fc92205380f
MD5 4f26ccb2533b8d33858aa7084f6c00bf
BLAKE2b-256 e42103f438fbcc1ca6137f5af59ff58c7eca2f5b91bd0b443a59440304ae1fbf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp315-cp315t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 15104fb8e7946a6639eccd89c16d05c43ecdd493c97c415d1ad0b00cb6722540
MD5 22b95b12da01cd2b768a00aa86337d72
BLAKE2b-256 9fb2e8e9b6a3da2892673804c59c9a7c8fb29bcf40bda99f283cd47d5dad7088

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp315-cp315t-manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 94ea4531e2bbe385cc2dc965e1cb33015996e808f966c0a334ee2ad8f381264b
MD5 ea7b8a86be8fddd0f49459e493e33771
BLAKE2b-256 0d8f0533072ff8f4b6e11ce722277ec65ba88879ab654dcf3f46d20c209ad70c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp315-cp315t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c14da904d02f71b22e02004188ee0df66568415f6941ea32f124a0c07d57b88b
MD5 071b830968a70d47c7986cf165ac31bd
BLAKE2b-256 8c8adc58d836789d4eb8e488419dd1ba2a6328b9d8ffa6465319d235a9a24c50

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp315-cp315t-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 0c78a53649ce6aa238fa7da79a4a93931cacd80b7e9bdbe89b296902f2533aed
MD5 7ec7207f507a0b95dfa9f1fe59e8f3c4
BLAKE2b-256 1d690a8938c3a30fbaba97d89df23d15ac05bf5a5bd9afea318734a6ad17efaf

See more details on using hashes here.

File details

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

File metadata

  • Download URL: granian-2.8.2-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.2-cp315-cp315-win_amd64.whl
Algorithm Hash digest
SHA256 e4ebcde088974cb23332f921b6418448d4328873311006798e61e23ceb773376
MD5 faff4205ee64678d183ff06fcc68f3c2
BLAKE2b-256 5159345032b735050959c59a12e2c8cd2def3561751824ee9c08ef0779f4f3f2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp315-cp315-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 80c10fd8879dd5972ef67cc91255d628e860f477b0f9c9f165331132916ca637
MD5 ac4db64c03b167fca1e94e4a04561342
BLAKE2b-256 bc307248eafd8742ffb47ebcfd194a211b6447445214859ececbb2b26e0d4357

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp315-cp315-musllinux_1_1_armv7l.whl
Algorithm Hash digest
SHA256 1dc5155ccadeedafa25baea4ad2cd3003db7127257ef1eb623039b2e7087c759
MD5 d217c168a1acf18701eedf20f1a8966a
BLAKE2b-256 2dc85d85ca4818e74f9ac0ac71a88752a2f81655e3df787da7698667141fcd4e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp315-cp315-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 f20441ccb3b500c5e6368afc237257775fb893584aebc087157056f78643f3e8
MD5 16810ca074115f142acd2acdd8471a7b
BLAKE2b-256 5b008fb27a5f60bb0ebab2089153c438190f154613f7838ae6ac3af1d33ab408

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp315-cp315-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 d3c881e567ee36f791b850358154daadb5b1262a9bf8a56b2048f53586b1e678
MD5 9f5f8cde59cc18f9f6a7b59f330737e8
BLAKE2b-256 9db0e62d321d983cfe7ac4a0472b5d66ef672aeebec7c3d9d4b6ab4fbaabf4f0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 225fc15fce8201a3d341e2eaece168a6e344dcf38cace59ecf2049be286dca33
MD5 1226b9fd4ac41aee8de74c4c6b2d4d74
BLAKE2b-256 72476eb90fdedf5c90d0057c64454a75bb3d108e942b29284ab05a5bade7b70e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp315-cp315-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 bbbe64f19cdceb306b91bed01ce875e3f4ffcbafedaf2d30bedbeb33682a026d
MD5 e5d7298f929ac8daa49a42b97263f99b
BLAKE2b-256 462c741cc89d3820b2d771b1f318450ebbf4d6c992b98df2e9bbb07a93020321

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 927e248fc2225709ef82d8fbec88e1bc44286cfcb2e033e83d9bc935e863a897
MD5 3b5091f7a72b0ed8a2633bac8e51e338
BLAKE2b-256 7b81ca766e0f223cf88e8abcd1e9edc7513b0a4960f9c351d2b9bc594545293e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp315-cp315-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f42da6a579030774a25df67b5432ced73bd2f8eda36df11d79739059c03c4740
MD5 50248e1e3a8146c91200e9953c09a7b9
BLAKE2b-256 035eb01066c3a5695fc97654855617222c0d4e77dafd94c31dc7a1b2ed0349d1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp315-cp315-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 63fc5f40e7e258be3f61199a73fd85f49b74d0514fbc993f5e6263fa9d104013
MD5 f7e5e88cb56399c8f01bee3eaeb8602b
BLAKE2b-256 40f61677a9266332a6d044247af0f89e98d89fddfa6c93ae598ed7db3be9b904

See more details on using hashes here.

File details

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

File metadata

  • Download URL: granian-2.8.2-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.2-cp314-cp314t-win_amd64.whl
Algorithm Hash digest
SHA256 144af53b25ef35e119cb15b79514600896c6f5f3bdac83f7d6c80a2a7384cfaa
MD5 dc23b000f85ef5459a02f0707ebf69b1
BLAKE2b-256 9d0975c9b7d78d0a15fe6b74a160fbc799d141fea9b67ef869c149bccc2de0a7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp314-cp314t-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 de73d86d7ae6af5b6248840c4b700a39cdb13f7ac8f5e31d74f203c8cffad8fc
MD5 c6c194949aace30ff1a00e7b42656336
BLAKE2b-256 76833ef6394c090e33bc69905a630852b3931b7009f610403ca5facd7d99e046

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp314-cp314t-musllinux_1_1_armv7l.whl
Algorithm Hash digest
SHA256 886e727e11706897db81d97b976c12e3613c22df299d56bde446e71906ebbc9a
MD5 a47bebdc32d587654a5ef1f2abdd54de
BLAKE2b-256 38cc0d8680d6cd9cd1f2e0629e2a999185cdb6e9c8e14e76fb31404167ab289b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp314-cp314t-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 8af72cee8823da6280251e53aec774abfd093588a6db9ce8193d0076851601d1
MD5 7f1570434aaee95f7d7e661cb469df39
BLAKE2b-256 1741c684ca1ed8cd2e84278d39d741cdaf39c3b8698a141e1f22370e44c54fc1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp314-cp314t-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 77a1119ef84fbde0c4705cb09f3ebaa23807f5d4ddf4d1a5f7bf11056842b8d5
MD5 fdd2f870b17be586bdfef43b5c21dff5
BLAKE2b-256 c113201a2709a0d5068d65a8b0c055d563ea8e8ca522e41520589a7629a2b62b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b659f4f8cfa388734550db794752dcf8fb7bcef7fa2e55ba877e961350fcb8fb
MD5 8227783689642952484c2ba4e2ad0cb7
BLAKE2b-256 74233e2a836393f49e5a637049ef91a2ac1ab3088c5512fd1e3795745f152e0c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 7e624b05e9c7ef50cbf7f3fb69d54a8b8e5924c21161634f02d93e2cbe845337
MD5 7e24f5b16b2d1b78b432a6abf122d216
BLAKE2b-256 258da1a287b41da872bd9a014b6fefe80d9a224f9d709b5b0b3b4583e2ff8766

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp314-cp314t-manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 e16cd27f6896238d9a09998e1bd2244a68b0ea43e6325f2e6107fd6497731248
MD5 cd0a71c0f04eddf5d493811ace03d304
BLAKE2b-256 482a122ff8c770824e34b852d32b8d3ad9562b246b4740b978a5f6b616e2f4b4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp314-cp314t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 df45b9f1e7ddafe4e6e51382cb39cd458e99a5536278b5c5e713dac8c698bee7
MD5 b245d5d76edf767b90cda544dcc3b5d9
BLAKE2b-256 3cac1e0ca7917b84d302f81929cfe1dc5ee43b58a759168008474ee9b52f3a16

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp314-cp314t-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 825481c04ecd4c8e493a9f6c4b0f35d49ddf62a5576d7247e91d8e19a4bc87ff
MD5 32e002b5c715b4311b0eaa87f06a98f9
BLAKE2b-256 a4dce497711f5379b8f09595f1d3989c0fd4e9198be8d5735797e5b23841e3e6

See more details on using hashes here.

File details

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

File metadata

  • Download URL: granian-2.8.2-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.2-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 23474c7cd397741bd375f2a2c66244c0406f8911619c59a260149b22f86f76c9
MD5 7373c95d8984611591943cf553f106ce
BLAKE2b-256 a6f016d5281e21e677443afc26a504340bee8bd56194dc07a3f07bc9e5ca7903

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp314-cp314-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 3a01905b1cef50c502f1866434770b2821a7ccc2cdd7b9d8ab06dee84e19720b
MD5 7c4be6cac13e160251b0b1d8a6bcb329
BLAKE2b-256 8d02b1ad423fe2bc981b38e42d701284aa16f39d4711e5322af5707496729e4e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp314-cp314-musllinux_1_1_armv7l.whl
Algorithm Hash digest
SHA256 37536dcc0592bc7f65dcbb260173e7d5719207fdf3f8dcdc8d573bc664ad014e
MD5 f7f3f0b0a3b194772285a520823ea594
BLAKE2b-256 ae2cb88aaad8cf77d88efa9409d4defc624e9b50d223aaf5765e511a8d3f4791

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp314-cp314-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 e829a39c3ead7e91ab58cbf82800cdac4306a71805962d5e0ddb0c292d521696
MD5 05bf8c08e043f1b94c6e90b73fd87059
BLAKE2b-256 a4a1e0ab4e7ab2c24976230d7a925492c5d7337c53fcde759d793f614bb1bbaf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp314-cp314-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 52d59102c33717960edd3ffc4d81719509e15f06f049e6321e41ccf444d58eef
MD5 e94c14d9002d277808ad4d530f9be9bd
BLAKE2b-256 9d06c80cc94cb48d39c59ddac3f83cbea7f25bd869b9c90d021932ea0b3eca8a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8d33a2be566fdb81fc6de918930a9cd3b434eb6d696a086ddbb0ff73c180402c
MD5 244d8fcf1f95ff229381b8c131c3ce19
BLAKE2b-256 29b541a8d350c3f9414f62c136290f5ffa866d589a7b225046be5839f5e9b199

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 6521b5022e8d4fa0e7c68f5189ce00f5e83af7a36e84f0475f02612aa1c8c70e
MD5 7b36444bcb72247ee817d25fa76f5872
BLAKE2b-256 fe9ce24207aefdb08ffd9d07797d261117dd7f92b503416aab238b2ed7bae946

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 89db0fbec47cc45c9044c4b91ca0ce00d6f048145eaa3f49e9d4b1e420057fd6
MD5 9a3162876469e5221dc1acfaa05cd155
BLAKE2b-256 bdcf774845ff6c8bf26ceb1f439c4189bad1d31c6cd8da91f7fd88f3b6684edd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3d150f1678ed5c90e3bd17db5ab66c8355f01dfc66ff46adc898e792d0cb577f
MD5 377d3785cdb980af734ee6482d0b8164
BLAKE2b-256 c4a7c71267bcb49a9f9dab7997c2463d8a452539bde8dbb25c171c3be37be6e0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp314-cp314-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 325458915a148c878275524ddd959bfd35a83d1672369aa45df04a52c71dd5db
MD5 19b420396a4dbe60948e567536bfb16e
BLAKE2b-256 92f969107c8b1743a41e9d125cb6d2a98cb43eea76b8d33761e0b0328aef1bb8

See more details on using hashes here.

File details

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

File metadata

  • Download URL: granian-2.8.2-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.2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 000d459d3b6cc7eb43ae673ba77411e27bdc1e278b6f7e4e01cf3fcdad2d4c6d
MD5 8f6be40c99298ea58f36376e9c955418
BLAKE2b-256 b9122c7c44c5a4c1afe2841cb1f3e91fa47411cc86b3c8d5409d23e5a1873ff4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp313-cp313-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 43c670710b34b65693f3e36d7665b18eb819e4783d43368c8144e2e9deff6b40
MD5 2951f36845a22796b0b1f38022457739
BLAKE2b-256 a845c64bbc08bf1af0efbc5424fbb5760008b87b7e0782759c7367c59fa1d314

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp313-cp313-musllinux_1_1_armv7l.whl
Algorithm Hash digest
SHA256 b22cbcc8e5ca399c0b231a74bb87b4f477a59b4c4852daa7f488c0a6561b1666
MD5 b858cab0afafeef25748fd891d575d15
BLAKE2b-256 584d790a3bd672719c1d0487adaa2db4a962e401d6c0f2d61c7af5ae94b658cc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp313-cp313-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 63ba5fada798ff9d7fdedc3bd1fbed60d8269195fd13d4f48c273024eb23a292
MD5 e74445ba79b288c85a2508cc9ce587ab
BLAKE2b-256 d5c4764a6de6613395d85a4e6f6c26f048e95226454b2189987d1983e97f1024

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp313-cp313-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 8a9d20c8a509213bf0c3235c79c3d1892aa887521dd7ea4c36a2ee40dcdb72ab
MD5 a697c8b3222b0b6012c4c31e6128f8f7
BLAKE2b-256 ef331e3edea3be88a5b133cda591a20b227cab5a4a054c6b9a2902e63d594c06

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7fdc50c290dc26d61891255b6e118606c1fd8fbdfba3059da199052172ecb539
MD5 871e96a7db486e94d09ac58813723498
BLAKE2b-256 431e4558dd1a4df3b4fe92e5ee29f35773f9b152dba9eaf1deda28cc8437af53

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 35414a2eea2adf92e71762a6793412794ae32540e1103400e62dd423f38b5a7a
MD5 148921eb3755e9ff56b7c1461fc34ed5
BLAKE2b-256 d6d82fe874582f1a688f9cceef842be1ec47c5890b7e80f596cf2ddbee116fa5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 ae8805ea5d0dbb31d232437df9d23bf4a21a1a7e472cce05b11594662278b3b4
MD5 314436bba56d31642b684e305881cd72
BLAKE2b-256 0c37c58067f3d913f45307c7efa7e09d4248a3b4b1289ac5b5a56c8a0730c10f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 679ac93bc56b6af17363b6577b8e36c399e0283128f76d00e6254433b26fd037
MD5 b1794f36237cc2b553108c7f603b0885
BLAKE2b-256 c70596ac5277451f226941a17670f3607055b84e3e12b15944af7d420d5c9964

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 434deec2c9af78785c93cd7f7a81f9869afc3003170e309ffc23f9b8ad6bbd35
MD5 9ac4053278d280174a2ee1e630003edc
BLAKE2b-256 b33c2b62d895c472d08f41a845497808dd8c591a82ad60fc9828fdd240cbb7e7

See more details on using hashes here.

File details

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

File metadata

  • Download URL: granian-2.8.2-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 3.2 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.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 9602e34f57f1c5c7c4c4b9b5fe11968c3223182cabfc6dbd7d7ee06e9ff25b95
MD5 39ffaf8b023f1a23aa85bc4c0519b7d9
BLAKE2b-256 f5d05603f7bdf8c5f2e58dd344323759d9c78688fd993253e28fda17e4c3b324

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp312-cp312-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 a55b966ce6e3cced43b1b337652fb714ea355e8cc4647045118b525e2e57c722
MD5 23396e09bbd989b512693658ccdc7511
BLAKE2b-256 6ba4568cbde461f6685018afb107168592d98d4539fa63c4a63a87628eed5ddf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp312-cp312-musllinux_1_1_armv7l.whl
Algorithm Hash digest
SHA256 9e92f4319f2fb955f6e8f620381fe015e67c66506de73dd0e92ef0e0d10fab20
MD5 526f37fc747b809e211707c46cf4d3de
BLAKE2b-256 82e3b5ce63e182a8623e1c735e60d53b0cf91f7fb0a12e588ba57a22556b5e64

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp312-cp312-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 aacebc0cbf1e4068918b0d6450ab538ad7bd4c42cd866e76bbb13f87af45def4
MD5 206d0210ed3809652103b5755e878cb0
BLAKE2b-256 f9cab6c2b697ddd93c0066ce97a037ed0f754d05cf6bf3707c8bfe0246b9bab8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp312-cp312-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 7341d8672475707c733f4b6f98ca8524833aa70eaab2826f333f17214cb29132
MD5 793dc5cc4172de30ca5b0aeb9ebf7e1c
BLAKE2b-256 ba97de45ae209366f174ab9201a854a20143c7af1578d6d993a56e62a4b4e7ff

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a2fbff8464c7831cc7e2dc9dd7f04301de035c44481c1fafad7e87d2e479cddd
MD5 2f2450276585c6de363db079b71ab443
BLAKE2b-256 0af8ba7e1b9769bd1723369156acd3c0191fc1785d1fd224771a7b890842bf19

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 887c822fbe85e603dcab24138fcdfa02262e41737ccc016238c435e44b4a53dc
MD5 161a0d5dac3c7420a363e213efec0327
BLAKE2b-256 c00d9b86a600cc193a41ce00c46979f763bd13dc60d8a26e98d88cd5c1aa8a04

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 b5c6bb7a7bbedea92a6c6c200e1b01f3b5059a6c5b5b8face1fcd396682f0e29
MD5 3cb6449c4814fcb7c25fbada009715ce
BLAKE2b-256 0d7f6de20e29ef52bab40409e25a019419b876ddba7eba94422690c6a47539f3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e45ed005bbb6cb7f77682de2c72e33797f84310f8ffd0c97d0bd5b93aae4e185
MD5 f863621017d20bcca3b9c86839f5f219
BLAKE2b-256 2758a5c7d9d228e5aa3964681726ecc1f560a9179581d0b81f649d631e48ddf5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 15fca7c867b0477209dd02940d52a35dcf0785f70081824bca5dabf7ab0b3ba7
MD5 e49759507c5085499b08bc980782a428
BLAKE2b-256 58ca394e7ddd853f732a678eb54a60fd54334070c99b74dfe156614271a4419c

See more details on using hashes here.

File details

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

File metadata

  • Download URL: granian-2.8.2-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.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 f2738a9c49015c65c83a077a8c35a0e525152a6505ac267ba25d7b25a4547bb8
MD5 c77c718cb55a7236a5b728eec0864ab5
BLAKE2b-256 644e10566f58dcd8f060e881a8b3f525610897bb3d6e6a832c02338be7d00e72

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp311-cp311-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 b4006292f09145ce642131e2cb53e79ee12a92ef0f938d8e84e5d4d28cb7a030
MD5 0094303a82d6e702e61cd82950d93d0d
BLAKE2b-256 58334ce91368b66a471f93b55a805da3f407e5c22a8888859db775f2c81e55b6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp311-cp311-musllinux_1_1_armv7l.whl
Algorithm Hash digest
SHA256 79be108e63e7812237a67a7d2c97e1ab34411d4b3f7ad537e196f6afc0803659
MD5 c4c39be1ecedef7e1520489aa02ca834
BLAKE2b-256 cf4016489cc1a76560ab31306a656ca65fb856edc5ffad89fb6ad8eb9a1a22ee

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp311-cp311-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 d8d2ea99f8b4412eb4c320478148e58d76e5ebbb12bb487d7c64f7b4100517b0
MD5 cd7ba40a7ad9b5f02e778b9d63b53565
BLAKE2b-256 9a55a83cf2a1c3c0c711c0bad5d70f194fdebab6049a661b89bf7d880c8b55cd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp311-cp311-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 84fd77bb1a66d9cb06ebb68fa4480204b69ef6bb314e942ebad3f2952ea0e072
MD5 4e6c80d60ecb041a54ea7b54c8045d5e
BLAKE2b-256 65e2fc8d86ac636d1ac2d74145c7e4e262ecc217f25941fb4ab62f1411d5e2f8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 684fbb039483b42606bf74e8675262e1947ae7303e5a844a3194e02f2f853d51
MD5 c33f06b80efed92160933fba941e73b2
BLAKE2b-256 c3d9e7098bae4e0ec550bd28e3ac7a4ffda23e1b8659d155ed4e56076aa3a2c6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 c5ef2175682f3016589df34c0f348a7840e7513c60a1a3f60b6b78326509b5aa
MD5 0f006f3dfbc20366191a34af80768377
BLAKE2b-256 70952ffd4f0dd60cfba6edc0708efd5888fd5bc8898943cb8a4175b8a6758650

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 4053a99b6fb82e98807f854d3c6d6ebe0a49353c9eb7797999d166a99c1ae399
MD5 20e3ec440478a5d900535a53e0c50251
BLAKE2b-256 b2273b85635168f5e87e6e25fbd3d5ff34066ba353add7f66659510748b8a71c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 54d64fba52ae5b29e7fb8489fdec5185859b0e299a6add92d4d69bf94d8684e9
MD5 71abacbe0260ad6198ec20ee3225d410
BLAKE2b-256 cc4ccb16e44acceb935876599195f2dcc8a29394633aaeeb454a87066643e209

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 a1da543c6fafbae059e90df5756df17095ee059c9a9ec7acabd7dd88cc273184
MD5 4275e9dcc05bf9c84d5ca6cb8d661890
BLAKE2b-256 9c7c961d2db920e9eb4fcb079f08a0209d4873f9cc5ce33e23e2dfd197be7409

See more details on using hashes here.

File details

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

File metadata

  • Download URL: granian-2.8.2-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.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 76debbb97a1d5cc6a79274bb7e0c10d165d8d765ee942afb268800cbc63e3e82
MD5 18996b8fc9fa3f3619d46693dcbec170
BLAKE2b-256 fdffb49c939d91d4a2745f160cfed32fa0b7b5a967915de056602e89af3d8f2f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 34ace17c95430a97633837a8c454a02417b04340e1efc103186c9e66f1e941e9
MD5 d1fc566ef244eaf984e238b2a991ba00
BLAKE2b-256 a0c06d173658e8e0aafd8eb6a17917ae89f5a6fa6b0d6edf446e54cb834d7689

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp310-cp310-musllinux_1_1_armv7l.whl
Algorithm Hash digest
SHA256 de4e86991ff2e11736f3bc08c4616d96b3a79fa2e793159df54c2949cfd9edea
MD5 f4cc6283a7e598084b264794f214628e
BLAKE2b-256 5684124453b58bd8c21b4c833551c27c3db1bfd3ec67bf1ea86e2d702ce2f7a1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp310-cp310-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 d1db77297c2057533bbe9746c4992d0e3af33473bc585348d171646133257eed
MD5 2992554a89aa34d4436512434a62e887
BLAKE2b-256 8f4f20435189ae305048862ea82a2f384bd33a10686a2b7349ef6e179635591b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp310-cp310-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 9c45c819ff4ede289b1b4bf81aa904a8bdc58e2234e29d68b525d8ccf60ef918
MD5 6341da6d5e51c9c8bb8f00a8616f19c8
BLAKE2b-256 5e6c8dd18cb52432fba2fcf874b276e22d36e424e6bb1bee1bb2ec37e772b4f6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4483b4d2271bbfdc6337e7e58fdfc1841e250ec3f118ea843882a6244d47bd0c
MD5 bfad508e26e7de9dd501d20234220d78
BLAKE2b-256 36b340b27541519870f1350e997399838deded52389d5b76783276ef4cd32617

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 c60c9e1737f38f33af43326285d1d827bb8bf29974c758dddbca956ec3f3d72b
MD5 644ed1b3194fafd5eef0c2155042e225
BLAKE2b-256 f6f1063c00e09fc91d32c2d805daa5993ef970086ad706ee3219ba269c2e85e5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 76f32478f96dddecdf739b85f6f27a0c8e36f9426ee4e0f18017b38ef1faa869
MD5 85f6edff412756c06190da89bdc19d2b
BLAKE2b-256 e258752a070977606b46dd9597266e78bd61eb871b59775500a5e2d94a502693

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a7f61f507488fab88d0e561f7390ae77f8af397bd0106e11437be9b0fdaddcf9
MD5 318dc31b4b64d34f279ede6cd29b4643
BLAKE2b-256 31a3324d6c902113a779fcf4c7d58de9211f23a55e58a3656465ec1b4e13c37c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for granian-2.8.2-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 99e9653684d800460b3c438741091735ac43c2b27f62ea63eaa53d85aef987b6
MD5 832a4b2609cf7b0e6047fef9e0e35459
BLAKE2b-256 ceb2dcd57273268e70a886560589866446bdd9e41e0ea9b392c23948013e4626

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

2.8.2 This release

89 files

2.8.1

89 files

2.8.0

89 files

2.7.9

79 files

2.7.8

79 files

2.7.7

79 files

2.7.6

79 files

2.7.5

79 files

2.7.4

79 files

2.7.3

79 files

2.7.2

79 files

2.7.1

79 files

2.7.0

79 files

2.6.1

79 files

2.6.0

79 files

2.5.7

101 files

2.5.6

101 files

2.5.5

101 files

2.5.4

101 files

2.5.3

101 files

2.5.2

101 files

2.5.1

101 files

2.5.0

101 files

2.4.2

101 files

2.4.1

101 files

2.4.0

101 files

2.3.4

83 files

2.3.3

83 files

2.3.2

80 files

2.3.1

80 files

2.3.0

80 files

2.2.6

80 files

2.2.5

80 files

2.2.4

80 files

2.2.3

80 files

2.2.2

61 files

2.2.1

61 files

2.2.0

61 files

2.1.2

61 files

2.1.1

61 files

2.1.0

61 files

2.0.1

61 files

2.0.0

61 files

1.7.6

48 files

1.6.4

64 files

1.5.2

64 files

1.4.4

57 files

1.3.2

57 files

1.2.3

57 files

1.1.2

57 files

1.0.2

57 files

0.7.6

57 files

0.6.1

48 files

0.5.3

40 files

0.4.3

40 files

0.3.2

50 files

0.2.6

50 files

0.1.5

30 files

Supported by

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