import asyncio from datetime import datetime, timedelta, timezone from http.cookies import SimpleCookie from os import PathLike from pathlib import Path from typing import Callable, List, Optional, TYPE_CHECKING, Union from wsgiref.handlers import format_date_time from .globals import current_app from .typing import FilePath if TYPE_CHECKING: from .wrappers.response import Response # noqa: F401 def redirect(location: str, status_code: int=302) -> 'Response': body = f""" Redirect

Redirect

You should be redirected to {location}, if not please click the link """ return current_app.response_class( body, status=status_code, headers={'Location': location}, ) def create_cookie( key: str, value: str='', max_age: Optional[Union[int, timedelta]]=None, expires: Optional[Union[int, float, datetime]]=None, path: str='/', domain: Optional[str]=None, secure: bool=False, httponly: bool=False, ) -> SimpleCookie: """Create a Cookie given the options set The arguments are the standard cookie morsels and this is a wrapper around the stdlib SimpleCookie code. """ cookie = SimpleCookie() cookie[key] = value cookie[key]['path'] = path cookie[key]['httponly'] = httponly # type: ignore cookie[key]['secure'] = secure # type: ignore if isinstance(max_age, timedelta): cookie[key]['max-age'] = f"{max_age.total_seconds():d}" if isinstance(max_age, int): cookie[key]['max-age'] = str(max_age) if expires is not None and isinstance(expires, (int, float)): cookie[key]['expires'] = format_date_time(int(expires)) elif expires is not None and isinstance(expires, datetime): cookie[key]['expires'] = format_date_time(expires.replace(tzinfo=timezone.utc).timestamp()) if domain is not None: cookie[key]['domain'] = domain return cookie def ensure_coroutine(func: Callable) -> Callable: if asyncio.iscoroutinefunction(func): return func else: async_func = asyncio.coroutine(func) async_func._quart_async_wrapper = True # type: ignore return async_func def file_path_to_path(*paths: FilePath) -> Path: # Flask supports bytes paths safe_paths: List[Union[str, PathLike]] = [] for path in paths: if isinstance(path, bytes): safe_paths.append(path.decode()) else: safe_paths.append(path) return Path(*safe_paths)