mex.drop package¶
Subpackages¶
- mex.drop.api package
- mex.drop.file_history package
- mex.drop.login package
- Submodules
- mex.drop.login.main module
- mex.drop.login.state module
LoginState
LoginState.api_key
LoginState.backend_vars
LoginState.base_vars
LoginState.class_subclasses
LoginState.computed_vars
LoginState.event_handlers
LoginState.inherited_backend_vars
LoginState.inherited_vars
LoginState.login
LoginState.set_api_key
LoginState.set_x_system
LoginState.setvar
LoginState.vars
LoginState.x_system
- Module contents
- mex.drop.sinks package
- mex.drop.upload package
- Submodules
- mex.drop.upload.main module
- mex.drop.upload.models module
- mex.drop.upload.state module
UploadState
UploadState.backend_vars
UploadState.base_vars
UploadState.cancel_upload
UploadState.class_subclasses
UploadState.computed_vars
UploadState.event_handlers
UploadState.handle_upload
UploadState.inherited_backend_vars
UploadState.inherited_vars
UploadState.set_temp_files
UploadState.setvar
UploadState.submit_data
UploadState.temp_files
UploadState.vars
- Module contents
Submodules¶
mex.drop.exceptions module¶
- mex.drop.exceptions.custom_backend_handler(exception: Exception) EventSpec ¶
Custom backend exception handler.
mex.drop.files_io module¶
- mex.drop.files_io.check_duplicate_filenames(files: list[UploadFile]) None ¶
Check for duplicate filenames.
- async mex.drop.files_io.validate_file_extension(content_type: str | None, filename: str) None ¶
Validate uploaded file content type and extension.
- async mex.drop.files_io.write_to_file(content: bytes, out_file: Path) None ¶
Write content to file. Parse content according to file type.
mex.drop.layout module¶
- mex.drop.layout.app_logo() Component ¶
Return the app logo with icon and label.
Return a navigation bar component.
Return a link component for the given navigation item.
- mex.drop.layout.page(*children: Component) Component ¶
Return a page fragment with navigation bar and given children.
- mex.drop.layout.user_button() Component ¶
Return a user button with an icon that indicates their access rights.
Return a user menu with a trigger, the current X-System and a logout button.
mex.drop.logging module¶
mex.drop.main module¶
- mex.drop.main.drop_api() None ¶
Start the drop api.
- mex.drop.main.drop_frontend() None ¶
Start the drop frontend.
- mex.drop.main.main() None ¶
Start the drop api together with frontend.
mex.drop.models module¶
Bases:
Base
Model for one navigation bar item.
mex.drop.security module¶
- mex.drop.security.get_authorized_x_systems(user_database: UserDatabase, api_key: APIKey) list[Annotated[str, Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=None, max_length=None, pattern='^[a-zA-Z0-9\\._-]{1,128}$')]]] | None ¶
Get authorized x-systems from database.
- Parameters:
user_database – database dictionary
api_key – API key to check
- Returns:
optional list of authorized x-systems
- mex.drop.security.get_current_authorized_x_systems(api_key: Annotated[str | None, Depends(APIKeyHeader)]) list[Annotated[str, Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=None, max_length=None, pattern='^[a-zA-Z0-9\\._-]{1,128}$')]]] ¶
Get the current authorized x-systems.
- Raises:
HTTPException if no header is provided or no x-system is authorized –
- Parameters:
api_key – the API key for x-system lookup
- Settings:
drop_user_database: checked for presence of api_key
- Returns:
list of authorized x-systems
- mex.drop.security.is_authorized(x_system: Annotated[str, Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=None, max_length=None, pattern='^[a-zA-Z0-9\\._-]{1,128}$')]], authorized_x_systems: list[Annotated[str, Annotated[str, StringConstraints(strip_whitespace=None, to_upper=None, to_lower=None, strict=None, min_length=None, max_length=None, pattern='^[a-zA-Z0-9\\._-]{1,128}$')]]]) bool ¶
Check if the provided x-system is in the authorized x-systems.
- Parameters:
x_system – x-system to check
authorized_x_systems – list of authorized x-systems
- Returns:
True if x_system or admin is in the authorized_x_systems else False
mex.drop.settings module¶
- class mex.drop.settings.DropSettings(_env_file: Path | str | Sequence[Path | str] | None = PosixPath('.'), _env_file_encoding: str | None = None, _env_nested_delimiter: str | None = None, _secrets_dir: str | Path | None = None, *, pdb: bool = False, MEX_SINK: list[Sink] = [Sink.NDJSON], MEX_ASSETS_DIR: Path = PosixPath('/home/runner/work/mex-drop/mex-drop/assets'), MEX_WORK_DIR: Path = PosixPath('/home/runner/work/mex-drop/mex-drop'), MEX_IDENTITY_PROVIDER: IdentityProvider = IdentityProvider.MEMORY, MEX_BACKEND_API_URL: Url = Url('http://localhost:8080/'), MEX_BACKEND_API_KEY: SecretStr = SecretStr('**********'), MEX_BACKEND_API_PARALLELIZATION: int = 1, MEX_BACKEND_API_CHUNK_SIZE: int = 25, MEX_VERIFY_SESSION: bool | AssetsPath = True, MEX_ORGANIGRAM_PATH: AssetsPath = AssetsPath('raw-data/organigram/organizational_units.json'), MEX_PRIMARY_SOURCES_PATH: AssetsPath = AssetsPath('raw-data/primary-sources/primary-sources.json'), MEX_LDAP_URL: SecretStr = SecretStr('**********'), MEX_LDAP_SEARCH_BASE: str = 'DC=rki,DC=local', MEX_WIKI_API_URL: Url = Url('https://wikidata/'), MEX_WEB_USER_AGENT: str = 'rki/mex', MEX_ORCID_API_URL: Url = Url('https://orcid/'), MEX_DROP_API_HOST: Annotated[str, MinLen(min_length=1), MaxLen(max_length=250)] = 'localhost', MEX_DROP_API_PORT: Annotated[int, Gt(gt=0), Lt(lt=65536)] = 8021, MEX_DROP_FRONTEND_PORT: Annotated[int, Gt(gt=0), Lt(lt=65536)] = 8020, MEX_DROP_API_ROOT_PATH: str = '', MEX_DROP_DIRECTORY: WorkPath = WorkPath('data'), MEX_DROP_API_KEY_DATABASE: UserDatabase = {})¶
Bases:
BaseSettings
Settings definition for the drop server.
- drop_api_host: str¶
- drop_api_key_database: UserDatabase¶
- drop_api_port: int¶
- drop_api_root_path: str¶
- drop_directory: WorkPath¶
- drop_frontend_port: int¶
- model_computed_fields: ClassVar[Dict[str, ComputedFieldInfo]] = {}¶
A dictionary of computed field names and their corresponding ComputedFieldInfo objects.
- model_config: ClassVar[SettingsConfigDict] = {'arbitrary_types_allowed': True, 'case_sensitive': False, 'cli_avoid_json': False, 'cli_enforce_required': False, 'cli_exit_on_error': True, 'cli_flag_prefix_char': '-', 'cli_hide_none_type': False, 'cli_ignore_unknown_args': False, 'cli_implicit_flags': False, 'cli_kebab_case': False, 'cli_parse_args': None, 'cli_parse_none_str': None, 'cli_prefix': '', 'cli_prog_name': None, 'cli_use_class_docs_for_groups': False, 'enable_decoding': True, 'env_file': '.env', 'env_file_encoding': 'utf-8', 'env_ignore_empty': False, 'env_nested_delimiter': '__', 'env_parse_enums': None, 'env_parse_none_str': None, 'env_prefix': 'mex_', 'extra': 'ignore', 'json_file': None, 'json_file_encoding': None, 'nested_model_default_partial_update': False, 'populate_by_name': True, 'protected_namespaces': ('model_validate', 'model_dump', 'settings_customise_sources'), 'secrets_dir': None, 'toml_file': None, 'validate_assignment': True, 'validate_default': True, 'yaml_file': None, 'yaml_file_encoding': None}¶
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- model_fields: ClassVar[Dict[str, FieldInfo]] = {'assets_dir': FieldInfo(annotation=Path, required=False, default=PosixPath('/home/runner/work/mex-drop/mex-drop/assets'), alias_priority=2, validation_alias='MEX_ASSETS_DIR', description='Path to directory that contains input files treated as read-only, looks for a folder named `assets` in the current directory by default.'), 'backend_api_chunk_size': FieldInfo(annotation=int, required=False, default=25, alias_priority=2, validation_alias='MEX_BACKEND_API_CHUNK_SIZE', description='How many items to load into the backend in one chunk.'), 'backend_api_key': FieldInfo(annotation=SecretStr, required=False, default=SecretStr('**********'), alias_priority=2, validation_alias='MEX_BACKEND_API_KEY', description='Backend API key with write access to call POST/PUT endpoints'), 'backend_api_parallelization': FieldInfo(annotation=int, required=False, default=1, alias_priority=2, validation_alias='MEX_BACKEND_API_PARALLELIZATION', description='How many simultaneous threads may spin up to load data into the backend.'), 'backend_api_url': FieldInfo(annotation=Url, required=False, default=Url('http://localhost:8080/'), alias_priority=2, validation_alias='MEX_BACKEND_API_URL', description='MEx backend API url.'), 'debug': FieldInfo(annotation=bool, required=False, default=False, alias='pdb', alias_priority=2, validation_alias='MEX_DEBUG', description='Jump into post-mortem debugging after any uncaught exception.'), 'drop_api_host': FieldInfo(annotation=str, required=False, default='localhost', alias_priority=2, validation_alias='MEX_DROP_API_HOST', description='Host that the drop api will run on.', metadata=[MinLen(min_length=1), MaxLen(max_length=250)]), 'drop_api_key_database': FieldInfo(annotation=UserDatabase, required=False, default={}, alias_priority=2, validation_alias='MEX_DROP_API_KEY_DATABASE', description='Database of API keys.'), 'drop_api_port': FieldInfo(annotation=int, required=False, default=8021, alias_priority=2, validation_alias='MEX_DROP_API_PORT', description='Port that the drop api should listen on.', metadata=[Gt(gt=0), Lt(lt=65536)]), 'drop_api_root_path': FieldInfo(annotation=str, required=False, default='', alias_priority=2, validation_alias='MEX_DROP_API_ROOT_PATH', description='Root path that the drop server should run under.'), 'drop_directory': FieldInfo(annotation=WorkPath, required=False, default=WorkPath("data"), alias_priority=2, validation_alias='MEX_DROP_DIRECTORY', description='Root directory that the drop server should save files in, absolute or relative to `work_dir`.'), 'drop_frontend_port': FieldInfo(annotation=int, required=False, default=8020, alias_priority=2, validation_alias='MEX_DROP_FRONTEND_PORT', description='Port that the drop frontend should serve on.', metadata=[Gt(gt=0), Lt(lt=65536)]), 'identity_provider': FieldInfo(annotation=IdentityProvider, required=False, default=<IdentityProvider.MEMORY: 'memory'>, alias_priority=2, validation_alias='MEX_IDENTITY_PROVIDER', description='Provider to assign identifiers to new model instances.'), 'ldap_search_base': FieldInfo(annotation=str, required=False, default='DC=rki,DC=local', alias_priority=2, validation_alias='MEX_LDAP_SEARCH_BASE', description='Search base for the ldap connector.'), 'ldap_url': FieldInfo(annotation=SecretStr, required=False, default=SecretStr('**********'), alias_priority=2, validation_alias='MEX_LDAP_URL', description='LDAP server for person queries with authentication credentials. Must follow format `ldap://user:pw@host:port`, where `user` is the username, and `pw` is the password for authenticating against ldap, `host` is the url of the ldap server, and `port` is the port of the ldap server.'), 'mex_web_user_agent': FieldInfo(annotation=str, required=False, default='rki/mex', alias_priority=2, validation_alias='MEX_WEB_USER_AGENT', description='User agent is sent in request headers to external services.'), 'orcid_api_url': FieldInfo(annotation=Url, required=False, default=Url('https://orcid/'), alias_priority=2, validation_alias='MEX_ORCID_API_URL', description='URL of orcid api.'), 'organigram_path': FieldInfo(annotation=AssetsPath, required=False, default=AssetsPath("raw-data/organigram/organizational_units.json"), alias_priority=2, validation_alias='MEX_ORGANIGRAM_PATH', description='Path to the JSON file describing the organizational units, absolute path or relative to `assets_dir`.'), 'primary_sources_path': FieldInfo(annotation=AssetsPath, required=False, default=AssetsPath("raw-data/primary-sources/primary-sources.json"), alias_priority=2, validation_alias='MEX_PRIMARY_SOURCES_PATH', description='Path to the JSON file describing the primary sources, absolute path or relative to `assets_dir`.'), 'sink': FieldInfo(annotation=list[Sink], required=False, default=[<Sink.NDJSON: 'ndjson'>], alias_priority=2, validation_alias='MEX_SINK', description='Where to send data that is extracted or ingested. Defaults to writing ndjson files, but can be configured to push to the backend or the graph.'), 'verify_session': FieldInfo(annotation=Union[bool, AssetsPath], required=False, default=True, alias_priority=2, validation_alias='MEX_VERIFY_SESSION', description="Either a boolean that controls whether we verify the server's TLS certificate, or a path to a CA bundle to use. If a path is given, it can be either absolute or relative to the `assets_dir`. Defaults to True."), 'wiki_api_url': FieldInfo(annotation=Url, required=False, default=Url('https://wikidata/'), alias_priority=2, validation_alias='MEX_WIKI_API_URL', description='URL of the Wikidata API used to resolve an ID to an organization.'), 'work_dir': FieldInfo(annotation=Path, required=False, default=PosixPath('/home/runner/work/mex-drop/mex-drop'), alias_priority=2, validation_alias='MEX_WORK_DIR', description='Path to directory that stores generated and temporary files. Defaults to the current working directory.')}¶
Metadata about the fields defined on the model, mapping of field names to [FieldInfo][pydantic.fields.FieldInfo] objects.
This replaces Model.__fields__ from Pydantic V1.
- classmethod validate_user_database(value: dict[str, list[str]]) UserDatabase ¶
Ensure keys are APIKeys and values are XSystems.
mex.drop.state module¶
- class mex.drop.state.State(parent_state: BaseState | None = None, init_substates: bool = True, _reflex_internal_init: bool = False, *, substates: Dict[str, BaseState] = {}, dirty_vars: Set[str] = {}, dirty_substates: Set[str] = {}, router_data: Dict[str, Any] = {}, router: RouterData = RouterData(session=SessionData(client_token='', client_ip='', session_id=''), headers=HeaderData(host='', origin='', upgrade='', connection='', cookie='', pragma='', cache_control='', user_agent='', sec_websocket_version='', sec_websocket_key='', sec_websocket_extensions='', accept_encoding='', accept_language=''), page=PageData(host='', path='', raw_path='', full_path='', full_raw_path='', params={})), is_hydrated: bool = False, user: User | None = None, nav_items: list[NavItem] = [NavItem(title='Upload', path='/', underline='none'), NavItem(title='File History', path='/file-history', underline='none')], **kwargs)¶
Bases:
State
The app state.
- backend_vars: ClassVar[Dict[str, Any]] = {}¶
- base_vars: ClassVar[Dict[str, Var]] = {'nav_items': Var.__init_subclass__.<locals>.ToVarOperation(_js_expr='reflex___state____state__mex___drop___state____state.nav_items', _var_type=list[mex.drop.models.NavItem], _var_data=None, _original=Var(_js_expr='reflex___state____state__mex___drop___state____state.nav_items', _var_type=list[mex.drop.models.NavItem], _var_data=VarData(state='reflex___state____state.mex___drop___state____state', field_name='nav_items', imports=(('$/utils/context', (ImportVar(tag='StateContexts', is_default=False, alias=None, install=True, render=True, transpile=False),)), ('react', (ImportVar(tag='useContext', is_default=False, alias=None, install=True, render=True, transpile=False),))), hooks=('const reflex___state____state__mex___drop___state____state = useContext(StateContexts.reflex___state____state__mex___drop___state____state)',), deps=(), position=None))), 'user': Var.__init_subclass__.<locals>.ToVarOperation(_js_expr='reflex___state____state__mex___drop___state____state.user', _var_type=typing.Optional[mex.drop.models.User], _var_data=None, _original=Var(_js_expr='reflex___state____state__mex___drop___state____state.user', _var_type=<class 'mex.drop.models.User'>, _var_data=VarData(state='reflex___state____state.mex___drop___state____state', field_name='user', imports=(('$/utils/context', (ImportVar(tag='StateContexts', is_default=False, alias=None, install=True, render=True, transpile=False),)), ('react', (ImportVar(tag='useContext', is_default=False, alias=None, install=True, render=True, transpile=False),))), hooks=('const reflex___state____state__mex___drop___state____state = useContext(StateContexts.reflex___state____state__mex___drop___state____state)',), deps=(), position=None)))}¶
- check_login = EventHandler(event_actions={}, fn=<function State.check_login>, state_full_name='reflex___state____state.mex___drop___state____state')¶
- class_subclasses: ClassVar[Set[Type[BaseState]]] = {<class 'mex.drop.file_history.state.ListState'>, <class 'mex.drop.login.state.LoginState'>, <class 'mex.drop.upload.state.UploadState'>}¶
- computed_vars: ClassVar[Dict[str, ComputedVar]] = {'drop_version': FakeComputedVarBaseClass(_js_expr='drop_version', _var_type=<class 'str'>, _var_data=VarData(state='reflex___state____state.mex___drop___state____state', field_name='', imports=(('$/utils/context', (ImportVar(tag='StateContexts', is_default=False, alias=None, install=True, render=True, transpile=False),)), ('react', (ImportVar(tag='useContext', is_default=False, alias=None, install=True, render=True, transpile=False),))), hooks=('const reflex___state____state__mex___drop___state____state = useContext(StateContexts.reflex___state____state__mex___drop___state____state)',), deps=(), position=None), _cache=True, _backend=False, _initial_value=Unset, _static_deps=set(), _auto_deps=True, _update_interval=None, _fget=<function State.drop_version>)}¶
- drop_version¶
Base class of converting a var to another var type.
- event_handlers: ClassVar[Dict[str, EventHandler]] = {'check_login': EventHandler(event_actions={}, fn=<function State.check_login>, state_full_name='reflex___state____state.mex___drop___state____state'), 'load_nav': EventHandler(event_actions={}, fn=<function State.load_nav>, state_full_name='reflex___state____state.mex___drop___state____state'), 'logout': EventHandler(event_actions={}, fn=<function State.logout>, state_full_name='reflex___state____state.mex___drop___state____state'), 'set_nav_items': EventHandler(event_actions={}, fn=<function reflex___state____state.mex___drop___state____state.set_nav_items>, state_full_name='reflex___state____state.mex___drop___state____state'), 'set_user': EventHandler(event_actions={}, fn=<function reflex___state____state.mex___drop___state____state.set_user>, state_full_name='reflex___state____state.mex___drop___state____state'), 'setvar': EventHandlerSetVar(event_actions={}, fn=<function EventHandlerSetVar.setvar>, state_full_name='reflex___state____state.mex___drop___state____state', state_cls=<class 'mex.drop.state.State'>)}¶
- inherited_backend_vars: ClassVar[Dict[str, Any]] = {}¶
- inherited_vars: ClassVar[Dict[str, Var]] = {'is_hydrated': Var.__init_subclass__.<locals>.ToVarOperation(_js_expr='reflex___state____state.is_hydrated', _var_type=<class 'bool'>, _var_data=None, _original=Var(_js_expr='reflex___state____state.is_hydrated', _var_type=<class 'bool'>, _var_data=VarData(state='reflex___state____state', field_name='is_hydrated', imports=(('$/utils/context', (ImportVar(tag='StateContexts', is_default=False, alias=None, install=True, render=True, transpile=False),)), ('react', (ImportVar(tag='useContext', is_default=False, alias=None, install=True, render=True, transpile=False),))), hooks=('const reflex___state____state = useContext(StateContexts.reflex___state____state)',), deps=(), position=None))), 'router': Var.__init_subclass__.<locals>.ToVarOperation(_js_expr='reflex___state____state.router', _var_type=<class 'reflex.istate.data.RouterData'>, _var_data=None, _original=Var(_js_expr='reflex___state____state.router', _var_type=<class 'reflex.istate.data.RouterData'>, _var_data=VarData(state='reflex___state____state', field_name='router', imports=(('$/utils/context', (ImportVar(tag='StateContexts', is_default=False, alias=None, install=True, render=True, transpile=False),)), ('react', (ImportVar(tag='useContext', is_default=False, alias=None, install=True, render=True, transpile=False),))), hooks=('const reflex___state____state = useContext(StateContexts.reflex___state____state)',), deps=(), position=None)))}¶
- logout = EventHandler(event_actions={}, fn=<function State.logout>, state_full_name='reflex___state____state.mex___drop___state____state')¶
Base class of converting a var to another var type.
- set_user = EventHandler(event_actions={}, fn=<function reflex___state____state.mex___drop___state____state.set_user>, state_full_name='reflex___state____state.mex___drop___state____state')¶
- setvar: ClassVar[EventHandler] = EventHandlerSetVar(event_actions={}, fn=<function EventHandlerSetVar.setvar>, state_full_name='reflex___state____state.mex___drop___state____state', state_cls=<class 'mex.drop.state.State'>)¶
- vars: ClassVar[Dict[str, Var]] = {'drop_version': FakeComputedVarBaseClass(_js_expr='drop_version', _var_type=<class 'str'>, _var_data=VarData(state='reflex___state____state.mex___drop___state____state', field_name='', imports=(('$/utils/context', (ImportVar(tag='StateContexts', is_default=False, alias=None, install=True, render=True, transpile=False),)), ('react', (ImportVar(tag='useContext', is_default=False, alias=None, install=True, render=True, transpile=False),))), hooks=('const reflex___state____state__mex___drop___state____state = useContext(StateContexts.reflex___state____state__mex___drop___state____state)',), deps=(), position=None), _cache=True, _backend=False, _initial_value=Unset, _static_deps=set(), _auto_deps=True, _update_interval=None, _fget=<function State.drop_version>), 'is_hydrated': Var.__init_subclass__.<locals>.ToVarOperation(_js_expr='reflex___state____state.is_hydrated', _var_type=<class 'bool'>, _var_data=None, _original=Var(_js_expr='reflex___state____state.is_hydrated', _var_type=<class 'bool'>, _var_data=VarData(state='reflex___state____state', field_name='is_hydrated', imports=(('$/utils/context', (ImportVar(tag='StateContexts', is_default=False, alias=None, install=True, render=True, transpile=False),)), ('react', (ImportVar(tag='useContext', is_default=False, alias=None, install=True, render=True, transpile=False),))), hooks=('const reflex___state____state = useContext(StateContexts.reflex___state____state)',), deps=(), position=None))), 'nav_items': Var.__init_subclass__.<locals>.ToVarOperation(_js_expr='reflex___state____state__mex___drop___state____state.nav_items', _var_type=list[mex.drop.models.NavItem], _var_data=None, _original=Var(_js_expr='reflex___state____state__mex___drop___state____state.nav_items', _var_type=list[mex.drop.models.NavItem], _var_data=VarData(state='reflex___state____state.mex___drop___state____state', field_name='nav_items', imports=(('$/utils/context', (ImportVar(tag='StateContexts', is_default=False, alias=None, install=True, render=True, transpile=False),)), ('react', (ImportVar(tag='useContext', is_default=False, alias=None, install=True, render=True, transpile=False),))), hooks=('const reflex___state____state__mex___drop___state____state = useContext(StateContexts.reflex___state____state__mex___drop___state____state)',), deps=(), position=None))), 'router': Var.__init_subclass__.<locals>.ToVarOperation(_js_expr='reflex___state____state.router', _var_type=<class 'reflex.istate.data.RouterData'>, _var_data=None, _original=Var(_js_expr='reflex___state____state.router', _var_type=<class 'reflex.istate.data.RouterData'>, _var_data=VarData(state='reflex___state____state', field_name='router', imports=(('$/utils/context', (ImportVar(tag='StateContexts', is_default=False, alias=None, install=True, render=True, transpile=False),)), ('react', (ImportVar(tag='useContext', is_default=False, alias=None, install=True, render=True, transpile=False),))), hooks=('const reflex___state____state = useContext(StateContexts.reflex___state____state)',), deps=(), position=None))), 'user': Var.__init_subclass__.<locals>.ToVarOperation(_js_expr='reflex___state____state__mex___drop___state____state.user', _var_type=typing.Optional[mex.drop.models.User], _var_data=None, _original=Var(_js_expr='reflex___state____state__mex___drop___state____state.user', _var_type=<class 'mex.drop.models.User'>, _var_data=VarData(state='reflex___state____state.mex___drop___state____state', field_name='user', imports=(('$/utils/context', (ImportVar(tag='StateContexts', is_default=False, alias=None, install=True, render=True, transpile=False),)), ('react', (ImportVar(tag='useContext', is_default=False, alias=None, install=True, render=True, transpile=False),))), hooks=('const reflex___state____state__mex___drop___state____state = useContext(StateContexts.reflex___state____state__mex___drop___state____state)',), deps=(), position=None)))}¶
mex.drop.types module¶
- class mex.drop.types.APIKey(secret_value: SecretType)¶
Bases:
SecretStr
An API Key used for authenticating and authorizing a client.