github slackapi/python-slack-sdk v3.9.0
version 3.9.0

latest releases: v3.33.3, v3.33.2, v3.33.1...
3 years ago

New Features

Sign in with Slack (OpenID Connect)

Sign in with Slack helps users log into your service using their Slack profile. The platform feature was recently upgraded to be compatible with the standard OpenID Connect specification. With this version of slack-sdk, implementing the auth flow is much easier.

When you create a new Slack app, set the following user scopes:

oauth_config:
  redirect_urls:
    - https://{your-domain}/slack/oauth_redirect
  scopes:
    user:
      - openid   # required
      - email    # optional
      - profile  # optional

Check the Flask example in the repository. It does the following:

  • Build the OpenID Connect comaptible authorize URL
    • slack_sdk.oauth.OpenIDConnectAuthorizeUrlGenerator helps you easily do this
    • OAuthStateStore is still available for generating state parameter value (it's available for nonce management too)
  • WebClient can perform openid.connect.token API calls with given code parameter

If you want to know the way with asyncio, check the Sanic app example in the same directory.

Built-in Retry Handlers

This version introduces a built-in retry functionalities to the following API clients:

  • slack_sdk.web.WebClient
  • slack_sdk.webhook.WebhookClient
  • slack_sdk.audit_logs.AuditLogsClient
  • slack_sdk.scim.SCIMClient
  • slack_sdk.web.async_client.AsyncWebClient (aiohttp/asyncio compatible)
  • slack_sdk.webhook.async_client.AsyncWebhookClient (aiohttp/asyncio compatible)
  • slack_sdk.audit_logs.async_client.AsyncAuditLogsClient (aiohttp/asyncio compatible)
  • slack_sdk.scim.async_client.AsyncSCIMClient (aiohttp/asyncio compatible)

With the default settings, only slack_sdk.http_retry.builtin_handlers.ConnectionErrorRetryHandler (AsyncConnectionErrorRetryHandler for asyncio clients) with its default configuratio (=only one retry in the manner of exponential backoff and jitter) is enabled in the above clients. The retry handler retries if an API client encounters a connectivity-related failure (e.g., Connection reset by peer).

import os
from slack_sdk.web import WebClient

# Only ConnectionErrorRetryHandler is enabled
client = WebClient(token=os.environ["SLACK_BOT_TOKEN"])

Another built-in retry handler is the one that handles rate limited errors.

# --------------------------------
# Use the built-in handlers
# --------------------------------

client = WebClient(token=os.environ["SLACK_BOT_TOKEN"])

# This handler does retries when HTTP status 429 is returned
from slack_sdk.http_retry.builtin_handlers import RateLimitErrorRetryHandler
rate_limit_handler = RateLimitErrorRetryHandler(max_retry_count=1)
# Enable rate limited error retries as well
cient.retry_handlers.append(rate_limit_handler)

Creating your own ones is also quite simple. Defining a new class that inherits slack_sdk.http_retry.RetryHandler and implements required methods (internals of can_retry / prepare_for_next_retry). Check the built-in ones' source code for learning how to properly implement.

# --------------------------------
# Create your own one
# --------------------------------

import socket
from typing import Optional
from slack_sdk.http_retry import (RetryHandler, RetryState, HttpRequest, HttpResponse)
from slack_sdk.http_retry.builtin_interval_calculators import (
    BackoffRetryIntervalCalculator,
)
from slack_sdk.http_retry.jitter import RandomJitter

class MyRetryHandler(RetryHandler):
    def _can_retry(
        self,
        *,
        state: RetryState,
        request: HttpRequest,
        response: Optional[HttpResponse] = None,
        error: Optional[Exception] = None
    ) -> bool:
        # [Errno 104] Connection reset by peer
        return (
            error is not None and isinstance(error, socket.error) and error.errno == 104
        )

# Customize the settings
my_handler = MyRetryHandler(
    max_retry_count=2,  # retry twice at maximum; the default is 1
    interval_calculator=BackoffRetryIntervalCalculator(  # exponential backoff and jitter is the default
        backoff_factor=1.0,  # 1, 2, 4, 8, 16 seconds later ...
        jitter=RandomJitter(),  # will add 0.0 -- 1.0 second to the backoff duration
    ),
)

client = WebClient(
    token=os.environ["SLACK_BOT_TOKEN"],
    retry_handlers=[rate_limit_handler, my_handler],
)

For asyncio apps, Async prefixed corresponding modules are available. All the methods in those methods are async/await compatible. Check the source code and tests for more details.

Changes


Don't miss a new python-slack-sdk release

NewReleases is sending notifications on new releases.