Skip to content
GitLab
Explore
Sign in
Hide whitespace changes
Inline
Side-by-side
Some changes are not shown.
For a faster browsing experience, only
20 of 203+
files are shown.
src/main/java/gui_server/server-temp/venv/lib/python3.10/site-packages/flask/blueprints.py
deleted
100644 → 0
View file @
34e4eb38
from
__future__
import
annotations
import
os
import
typing
as
t
from
datetime
import
timedelta
from
.globals
import
current_app
from
.helpers
import
send_from_directory
from
.sansio.blueprints
import
Blueprint
as
SansioBlueprint
from
.sansio.blueprints
import
BlueprintSetupState
as
BlueprintSetupState
# noqa
if
t
.
TYPE_CHECKING
:
# pragma: no cover
from
.wrappers
import
Response
class
Blueprint
(
SansioBlueprint
):
def
get_send_file_max_age
(
self
,
filename
:
str
|
None
)
->
int
|
None
:
"""
Used by :func:`send_file` to determine the ``max_age`` cache
value for a given file path if it wasn
'
t passed.
By default, this returns :data:`SEND_FILE_MAX_AGE_DEFAULT` from
the configuration of :data:`~flask.current_app`. This defaults
to ``None``, which tells the browser to use conditional requests
instead of a timed cache, which is usually preferable.
Note this is a duplicate of the same method in the Flask
class.
.. versionchanged:: 2.0
The default configuration is ``None`` instead of 12 hours.
.. versionadded:: 0.9
"""
value
=
current_app
.
config
[
"
SEND_FILE_MAX_AGE_DEFAULT
"
]
if
value
is
None
:
return
None
if
isinstance
(
value
,
timedelta
):
return
int
(
value
.
total_seconds
())
return
value
# type: ignore[no-any-return]
def
send_static_file
(
self
,
filename
:
str
)
->
Response
:
"""
The view function used to serve files from
:attr:`static_folder`. A route is automatically registered for
this view at :attr:`static_url_path` if :attr:`static_folder` is
set.
Note this is a duplicate of the same method in the Flask
class.
.. versionadded:: 0.5
"""
if
not
self
.
has_static_folder
:
raise
RuntimeError
(
"'
static_folder
'
must be set to serve static_files.
"
)
# send_file only knows to call get_send_file_max_age on the app,
# call it here so it works for blueprints too.
max_age
=
self
.
get_send_file_max_age
(
filename
)
return
send_from_directory
(
t
.
cast
(
str
,
self
.
static_folder
),
filename
,
max_age
=
max_age
)
def
open_resource
(
self
,
resource
:
str
,
mode
:
str
=
"
rb
"
)
->
t
.
IO
[
t
.
AnyStr
]:
"""
Open a resource file relative to :attr:`root_path` for
reading.
For example, if the file ``schema.sql`` is next to the file
``app.py`` where the ``Flask`` app is defined, it can be opened
with:
.. code-block:: python
with app.open_resource(
"
schema.sql
"
) as f:
conn.executescript(f.read())
:param resource: Path to the resource relative to
:attr:`root_path`.
:param mode: Open the file in this mode. Only reading is
supported, valid values are
"
r
"
(or
"
rt
"
) and
"
rb
"
.
Note this is a duplicate of the same method in the Flask
class.
"""
if
mode
not
in
{
"
r
"
,
"
rt
"
,
"
rb
"
}:
raise
ValueError
(
"
Resources can only be opened for reading.
"
)
return
open
(
os
.
path
.
join
(
self
.
root_path
,
resource
),
mode
)
src/main/java/gui_server/server-temp/venv/lib/python3.10/site-packages/flask/cli.py
deleted
100644 → 0
View file @
34e4eb38
from
__future__
import
annotations
import
ast
import
collections.abc
as
cabc
import
importlib.metadata
import
inspect
import
os
import
platform
import
re
import
sys
import
traceback
import
typing
as
t
from
functools
import
update_wrapper
from
operator
import
itemgetter
from
types
import
ModuleType
import
click
from
click.core
import
ParameterSource
from
werkzeug
import
run_simple
from
werkzeug.serving
import
is_running_from_reloader
from
werkzeug.utils
import
import_string
from
.globals
import
current_app
from
.helpers
import
get_debug_flag
from
.helpers
import
get_load_dotenv
if
t
.
TYPE_CHECKING
:
import
ssl
from
_typeshed.wsgi
import
StartResponse
from
_typeshed.wsgi
import
WSGIApplication
from
_typeshed.wsgi
import
WSGIEnvironment
from
.app
import
Flask
class
NoAppException
(
click
.
UsageError
):
"""
Raised if an application cannot be found or loaded.
"""
def
find_best_app
(
module
:
ModuleType
)
->
Flask
:
"""
Given a module instance this tries to find the best possible
application in the module or raises an exception.
"""
from
.
import
Flask
# Search for the most common names first.
for
attr_name
in
(
"
app
"
,
"
application
"
):
app
=
getattr
(
module
,
attr_name
,
None
)
if
isinstance
(
app
,
Flask
):
return
app
# Otherwise find the only object that is a Flask instance.
matches
=
[
v
for
v
in
module
.
__dict__
.
values
()
if
isinstance
(
v
,
Flask
)]
if
len
(
matches
)
==
1
:
return
matches
[
0
]
elif
len
(
matches
)
>
1
:
raise
NoAppException
(
"
Detected multiple Flask applications in module
"
f
"
'
{
module
.
__name__
}
'
. Use
'
{
module
.
__name__
}
:name
'"
"
to specify the correct one.
"
)
# Search for app factory functions.
for
attr_name
in
(
"
create_app
"
,
"
make_app
"
):
app_factory
=
getattr
(
module
,
attr_name
,
None
)
if
inspect
.
isfunction
(
app_factory
):
try
:
app
=
app_factory
()
if
isinstance
(
app
,
Flask
):
return
app
except
TypeError
as
e
:
if
not
_called_with_wrong_args
(
app_factory
):
raise
raise
NoAppException
(
f
"
Detected factory
'
{
attr_name
}
'
in module
'
{
module
.
__name__
}
'
,
"
"
but could not call it without arguments. Use
"
f
"
'
{
module
.
__name__
}
:
{
attr_name
}
(args)
'"
"
to specify arguments.
"
)
from
e
raise
NoAppException
(
"
Failed to find Flask application or factory in module
"
f
"
'
{
module
.
__name__
}
'
. Use
'
{
module
.
__name__
}
:name
'"
"
to specify one.
"
)
def
_called_with_wrong_args
(
f
:
t
.
Callable
[...,
Flask
])
->
bool
:
"""
Check whether calling a function raised a ``TypeError`` because
the call failed or because something in the factory raised the
error.
:param f: The function that was called.
:return: ``True`` if the call failed.
"""
tb
=
sys
.
exc_info
()[
2
]
try
:
while
tb
is
not
None
:
if
tb
.
tb_frame
.
f_code
is
f
.
__code__
:
# In the function, it was called successfully.
return
False
tb
=
tb
.
tb_next
# Didn't reach the function.
return
True
finally
:
# Delete tb to break a circular reference.
# https://docs.python.org/2/library/sys.html#sys.exc_info
del
tb
def
find_app_by_string
(
module
:
ModuleType
,
app_name
:
str
)
->
Flask
:
"""
Check if the given string is a variable name or a function. Call
a function to get the app instance, or return the variable directly.
"""
from
.
import
Flask
# Parse app_name as a single expression to determine if it's a valid
# attribute name or function call.
try
:
expr
=
ast
.
parse
(
app_name
.
strip
(),
mode
=
"
eval
"
).
body
except
SyntaxError
:
raise
NoAppException
(
f
"
Failed to parse
{
app_name
!r}
as an attribute name or function call.
"
)
from
None
if
isinstance
(
expr
,
ast
.
Name
):
name
=
expr
.
id
args
=
[]
kwargs
=
{}
elif
isinstance
(
expr
,
ast
.
Call
):
# Ensure the function name is an attribute name only.
if
not
isinstance
(
expr
.
func
,
ast
.
Name
):
raise
NoAppException
(
f
"
Function reference must be a simple name:
{
app_name
!r}
.
"
)
name
=
expr
.
func
.
id
# Parse the positional and keyword arguments as literals.
try
:
args
=
[
ast
.
literal_eval
(
arg
)
for
arg
in
expr
.
args
]
kwargs
=
{
kw
.
arg
:
ast
.
literal_eval
(
kw
.
value
)
for
kw
in
expr
.
keywords
if
kw
.
arg
is
not
None
}
except
ValueError
:
# literal_eval gives cryptic error messages, show a generic
# message with the full expression instead.
raise
NoAppException
(
f
"
Failed to parse arguments as literal values:
{
app_name
!r}
.
"
)
from
None
else
:
raise
NoAppException
(
f
"
Failed to parse
{
app_name
!r}
as an attribute name or function call.
"
)
try
:
attr
=
getattr
(
module
,
name
)
except
AttributeError
as
e
:
raise
NoAppException
(
f
"
Failed to find attribute
{
name
!r}
in
{
module
.
__name__
!r}
.
"
)
from
e
# If the attribute is a function, call it with any args and kwargs
# to get the real application.
if
inspect
.
isfunction
(
attr
):
try
:
app
=
attr
(
*
args
,
**
kwargs
)
except
TypeError
as
e
:
if
not
_called_with_wrong_args
(
attr
):
raise
raise
NoAppException
(
f
"
The factory
{
app_name
!r}
in module
"
f
"
{
module
.
__name__
!r}
could not be called with the
"
"
specified arguments.
"
)
from
e
else
:
app
=
attr
if
isinstance
(
app
,
Flask
):
return
app
raise
NoAppException
(
"
A valid Flask application was not obtained from
"
f
"
'
{
module
.
__name__
}
:
{
app_name
}
'
.
"
)
def
prepare_import
(
path
:
str
)
->
str
:
"""
Given a filename this will try to calculate the python path, add it
to the search path and return the actual module name that is expected.
"""
path
=
os
.
path
.
realpath
(
path
)
fname
,
ext
=
os
.
path
.
splitext
(
path
)
if
ext
==
"
.py
"
:
path
=
fname
if
os
.
path
.
basename
(
path
)
==
"
__init__
"
:
path
=
os
.
path
.
dirname
(
path
)
module_name
=
[]
# move up until outside package structure (no __init__.py)
while
True
:
path
,
name
=
os
.
path
.
split
(
path
)
module_name
.
append
(
name
)
if
not
os
.
path
.
exists
(
os
.
path
.
join
(
path
,
"
__init__.py
"
)):
break
if
sys
.
path
[
0
]
!=
path
:
sys
.
path
.
insert
(
0
,
path
)
return
"
.
"
.
join
(
module_name
[::
-
1
])
@t.overload
def
locate_app
(
module_name
:
str
,
app_name
:
str
|
None
,
raise_if_not_found
:
t
.
Literal
[
True
]
=
True
)
->
Flask
:
...
@t.overload
def
locate_app
(
module_name
:
str
,
app_name
:
str
|
None
,
raise_if_not_found
:
t
.
Literal
[
False
]
=
...
)
->
Flask
|
None
:
...
def
locate_app
(
module_name
:
str
,
app_name
:
str
|
None
,
raise_if_not_found
:
bool
=
True
)
->
Flask
|
None
:
try
:
__import__
(
module_name
)
except
ImportError
:
# Reraise the ImportError if it occurred within the imported module.
# Determine this by checking whether the trace has a depth > 1.
if
sys
.
exc_info
()[
2
].
tb_next
:
# type: ignore[union-attr]
raise
NoAppException
(
f
"
While importing
{
module_name
!r}
, an ImportError was
"
f
"
raised:
\n\n
{
traceback
.
format_exc
()
}
"
)
from
None
elif
raise_if_not_found
:
raise
NoAppException
(
f
"
Could not import
{
module_name
!r}
.
"
)
from
None
else
:
return
None
module
=
sys
.
modules
[
module_name
]
if
app_name
is
None
:
return
find_best_app
(
module
)
else
:
return
find_app_by_string
(
module
,
app_name
)
def
get_version
(
ctx
:
click
.
Context
,
param
:
click
.
Parameter
,
value
:
t
.
Any
)
->
None
:
if
not
value
or
ctx
.
resilient_parsing
:
return
flask_version
=
importlib
.
metadata
.
version
(
"
flask
"
)
werkzeug_version
=
importlib
.
metadata
.
version
(
"
werkzeug
"
)
click
.
echo
(
f
"
Python
{
platform
.
python_version
()
}
\n
"
f
"
Flask
{
flask_version
}
\n
"
f
"
Werkzeug
{
werkzeug_version
}
"
,
color
=
ctx
.
color
,
)
ctx
.
exit
()
version_option
=
click
.
Option
(
[
"
--version
"
],
help
=
"
Show the Flask version.
"
,
expose_value
=
False
,
callback
=
get_version
,
is_flag
=
True
,
is_eager
=
True
,
)
class
ScriptInfo
:
"""
Helper object to deal with Flask applications. This is usually not
necessary to interface with as it
'
s used internally in the dispatching
to click. In future versions of Flask this object will most likely play
a bigger role. Typically it
'
s created automatically by the
:class:`FlaskGroup` but you can also manually create it and pass it
onwards as click object.
"""
def
__init__
(
self
,
app_import_path
:
str
|
None
=
None
,
create_app
:
t
.
Callable
[...,
Flask
]
|
None
=
None
,
set_debug_flag
:
bool
=
True
,
)
->
None
:
#: Optionally the import path for the Flask application.
self
.
app_import_path
=
app_import_path
#: Optionally a function that is passed the script info to create
#: the instance of the application.
self
.
create_app
=
create_app
#: A dictionary with arbitrary data that can be associated with
#: this script info.
self
.
data
:
dict
[
t
.
Any
,
t
.
Any
]
=
{}
self
.
set_debug_flag
=
set_debug_flag
self
.
_loaded_app
:
Flask
|
None
=
None
def
load_app
(
self
)
->
Flask
:
"""
Loads the Flask app (if not yet loaded) and returns it. Calling
this multiple times will just result in the already loaded app to
be returned.
"""
if
self
.
_loaded_app
is
not
None
:
return
self
.
_loaded_app
if
self
.
create_app
is
not
None
:
app
:
Flask
|
None
=
self
.
create_app
()
else
:
if
self
.
app_import_path
:
path
,
name
=
(
re
.
split
(
r
"
:(?![\\/])
"
,
self
.
app_import_path
,
maxsplit
=
1
)
+
[
None
]
)[:
2
]
import_name
=
prepare_import
(
path
)
app
=
locate_app
(
import_name
,
name
)
else
:
for
path
in
(
"
wsgi.py
"
,
"
app.py
"
):
import_name
=
prepare_import
(
path
)
app
=
locate_app
(
import_name
,
None
,
raise_if_not_found
=
False
)
if
app
is
not
None
:
break
if
app
is
None
:
raise
NoAppException
(
"
Could not locate a Flask application. Use the
"
"
'
flask --app
'
option,
'
FLASK_APP
'
environment
"
"
variable, or a
'
wsgi.py
'
or
'
app.py
'
file in the
"
"
current directory.
"
)
if
self
.
set_debug_flag
:
# Update the app's debug flag through the descriptor so that
# other values repopulate as well.
app
.
debug
=
get_debug_flag
()
self
.
_loaded_app
=
app
return
app
pass_script_info
=
click
.
make_pass_decorator
(
ScriptInfo
,
ensure
=
True
)
F
=
t
.
TypeVar
(
"
F
"
,
bound
=
t
.
Callable
[...,
t
.
Any
])
def
with_appcontext
(
f
:
F
)
->
F
:
"""
Wraps a callback so that it
'
s guaranteed to be executed with the
script
'
s application context.
Custom commands (and their options) registered under ``app.cli`` or
``blueprint.cli`` will always have an app context available, this
decorator is not required in that case.
.. versionchanged:: 2.2
The app context is active for subcommands as well as the
decorated callback. The app context is always available to
``app.cli`` command and parameter callbacks.
"""
@click.pass_context
def
decorator
(
ctx
:
click
.
Context
,
/
,
*
args
:
t
.
Any
,
**
kwargs
:
t
.
Any
)
->
t
.
Any
:
if
not
current_app
:
app
=
ctx
.
ensure_object
(
ScriptInfo
).
load_app
()
ctx
.
with_resource
(
app
.
app_context
())
return
ctx
.
invoke
(
f
,
*
args
,
**
kwargs
)
return
update_wrapper
(
decorator
,
f
)
# type: ignore[return-value]
class
AppGroup
(
click
.
Group
):
"""
This works similar to a regular click :class:`~click.Group` but it
changes the behavior of the :meth:`command` decorator so that it
automatically wraps the functions in :func:`with_appcontext`.
Not to be confused with :class:`FlaskGroup`.
"""
def
command
(
# type: ignore[override]
self
,
*
args
:
t
.
Any
,
**
kwargs
:
t
.
Any
)
->
t
.
Callable
[[
t
.
Callable
[...,
t
.
Any
]],
click
.
Command
]:
"""
This works exactly like the method of the same name on a regular
:class:`click.Group` but it wraps callbacks in :func:`with_appcontext`
unless it
'
s disabled by passing ``with_appcontext=False``.
"""
wrap_for_ctx
=
kwargs
.
pop
(
"
with_appcontext
"
,
True
)
def
decorator
(
f
:
t
.
Callable
[...,
t
.
Any
])
->
click
.
Command
:
if
wrap_for_ctx
:
f
=
with_appcontext
(
f
)
return
super
(
AppGroup
,
self
).
command
(
*
args
,
**
kwargs
)(
f
)
# type: ignore[no-any-return]
return
decorator
def
group
(
# type: ignore[override]
self
,
*
args
:
t
.
Any
,
**
kwargs
:
t
.
Any
)
->
t
.
Callable
[[
t
.
Callable
[...,
t
.
Any
]],
click
.
Group
]:
"""
This works exactly like the method of the same name on a regular
:class:`click.Group` but it defaults the group class to
:class:`AppGroup`.
"""
kwargs
.
setdefault
(
"
cls
"
,
AppGroup
)
return
super
().
group
(
*
args
,
**
kwargs
)
# type: ignore[no-any-return]
def
_set_app
(
ctx
:
click
.
Context
,
param
:
click
.
Option
,
value
:
str
|
None
)
->
str
|
None
:
if
value
is
None
:
return
None
info
=
ctx
.
ensure_object
(
ScriptInfo
)
info
.
app_import_path
=
value
return
value
# This option is eager so the app will be available if --help is given.
# --help is also eager, so --app must be before it in the param list.
# no_args_is_help bypasses eager processing, so this option must be
# processed manually in that case to ensure FLASK_APP gets picked up.
_app_option
=
click
.
Option
(
[
"
-A
"
,
"
--app
"
],
metavar
=
"
IMPORT
"
,
help
=
(
"
The Flask application or factory function to load, in the form
'
module:name
'
.
"
"
Module can be a dotted import or file path. Name is not required if it is
"
"
'
app
'
,
'
application
'
,
'
create_app
'
, or
'
make_app
'
, and can be
'
name(args)
'
to
"
"
pass arguments.
"
),
is_eager
=
True
,
expose_value
=
False
,
callback
=
_set_app
,
)
def
_set_debug
(
ctx
:
click
.
Context
,
param
:
click
.
Option
,
value
:
bool
)
->
bool
|
None
:
# If the flag isn't provided, it will default to False. Don't use
# that, let debug be set by env in that case.
source
=
ctx
.
get_parameter_source
(
param
.
name
)
# type: ignore[arg-type]
if
source
is
not
None
and
source
in
(
ParameterSource
.
DEFAULT
,
ParameterSource
.
DEFAULT_MAP
,
):
return
None
# Set with env var instead of ScriptInfo.load so that it can be
# accessed early during a factory function.
os
.
environ
[
"
FLASK_DEBUG
"
]
=
"
1
"
if
value
else
"
0
"
return
value
_debug_option
=
click
.
Option
(
[
"
--debug/--no-debug
"
],
help
=
"
Set debug mode.
"
,
expose_value
=
False
,
callback
=
_set_debug
,
)
def
_env_file_callback
(
ctx
:
click
.
Context
,
param
:
click
.
Option
,
value
:
str
|
None
)
->
str
|
None
:
if
value
is
None
:
return
None
import
importlib
try
:
importlib
.
import_module
(
"
dotenv
"
)
except
ImportError
:
raise
click
.
BadParameter
(
"
python-dotenv must be installed to load an env file.
"
,
ctx
=
ctx
,
param
=
param
,
)
from
None
# Don't check FLASK_SKIP_DOTENV, that only disables automatically
# loading .env and .flaskenv files.
load_dotenv
(
value
)
return
value
# This option is eager so env vars are loaded as early as possible to be
# used by other options.
_env_file_option
=
click
.
Option
(
[
"
-e
"
,
"
--env-file
"
],
type
=
click
.
Path
(
exists
=
True
,
dir_okay
=
False
),
help
=
"
Load environment variables from this file. python-dotenv must be installed.
"
,
is_eager
=
True
,
expose_value
=
False
,
callback
=
_env_file_callback
,
)
class
FlaskGroup
(
AppGroup
):
"""
Special subclass of the :class:`AppGroup` group that supports
loading more commands from the configured Flask app. Normally a
developer does not have to interface with this class but there are
some very advanced use cases for which it makes sense to create an
instance of this. see :ref:`custom-scripts`.
:param add_default_commands: if this is True then the default run and
shell commands will be added.
:param add_version_option: adds the ``--version`` option.
:param create_app: an optional callback that is passed the script info and
returns the loaded app.
:param load_dotenv: Load the nearest :file:`.env` and :file:`.flaskenv`
files to set environment variables. Will also change the working
directory to the directory containing the first file found.
:param set_debug_flag: Set the app
'
s debug flag.
.. versionchanged:: 2.2
Added the ``-A/--app``, ``--debug/--no-debug``, ``-e/--env-file`` options.
.. versionchanged:: 2.2
An app context is pushed when running ``app.cli`` commands, so
``@with_appcontext`` is no longer required for those commands.
.. versionchanged:: 1.0
If installed, python-dotenv will be used to load environment variables
from :file:`.env` and :file:`.flaskenv` files.
"""
def
__init__
(
self
,
add_default_commands
:
bool
=
True
,
create_app
:
t
.
Callable
[...,
Flask
]
|
None
=
None
,
add_version_option
:
bool
=
True
,
load_dotenv
:
bool
=
True
,
set_debug_flag
:
bool
=
True
,
**
extra
:
t
.
Any
,
)
->
None
:
params
=
list
(
extra
.
pop
(
"
params
"
,
None
)
or
())
# Processing is done with option callbacks instead of a group
# callback. This allows users to make a custom group callback
# without losing the behavior. --env-file must come first so
# that it is eagerly evaluated before --app.
params
.
extend
((
_env_file_option
,
_app_option
,
_debug_option
))
if
add_version_option
:
params
.
append
(
version_option
)
if
"
context_settings
"
not
in
extra
:
extra
[
"
context_settings
"
]
=
{}
extra
[
"
context_settings
"
].
setdefault
(
"
auto_envvar_prefix
"
,
"
FLASK
"
)
super
().
__init__
(
params
=
params
,
**
extra
)
self
.
create_app
=
create_app
self
.
load_dotenv
=
load_dotenv
self
.
set_debug_flag
=
set_debug_flag
if
add_default_commands
:
self
.
add_command
(
run_command
)
self
.
add_command
(
shell_command
)
self
.
add_command
(
routes_command
)
self
.
_loaded_plugin_commands
=
False
def
_load_plugin_commands
(
self
)
->
None
:
if
self
.
_loaded_plugin_commands
:
return
if
sys
.
version_info
>=
(
3
,
10
):
from
importlib
import
metadata
else
:
# Use a backport on Python < 3.10. We technically have
# importlib.metadata on 3.8+, but the API changed in 3.10,
# so use the backport for consistency.
import
importlib_metadata
as
metadata
for
ep
in
metadata
.
entry_points
(
group
=
"
flask.commands
"
):
self
.
add_command
(
ep
.
load
(),
ep
.
name
)
self
.
_loaded_plugin_commands
=
True
def
get_command
(
self
,
ctx
:
click
.
Context
,
name
:
str
)
->
click
.
Command
|
None
:
self
.
_load_plugin_commands
()
# Look up built-in and plugin commands, which should be
# available even if the app fails to load.
rv
=
super
().
get_command
(
ctx
,
name
)
if
rv
is
not
None
:
return
rv
info
=
ctx
.
ensure_object
(
ScriptInfo
)
# Look up commands provided by the app, showing an error and
# continuing if the app couldn't be loaded.
try
:
app
=
info
.
load_app
()
except
NoAppException
as
e
:
click
.
secho
(
f
"
Error:
{
e
.
format_message
()
}
\n
"
,
err
=
True
,
fg
=
"
red
"
)
return
None
# Push an app context for the loaded app unless it is already
# active somehow. This makes the context available to parameter
# and command callbacks without needing @with_appcontext.
if
not
current_app
or
current_app
.
_get_current_object
()
is
not
app
:
# type: ignore[attr-defined]
ctx
.
with_resource
(
app
.
app_context
())
return
app
.
cli
.
get_command
(
ctx
,
name
)
def
list_commands
(
self
,
ctx
:
click
.
Context
)
->
list
[
str
]:
self
.
_load_plugin_commands
()
# Start with the built-in and plugin commands.
rv
=
set
(
super
().
list_commands
(
ctx
))
info
=
ctx
.
ensure_object
(
ScriptInfo
)
# Add commands provided by the app, showing an error and
# continuing if the app couldn't be loaded.
try
:
rv
.
update
(
info
.
load_app
().
cli
.
list_commands
(
ctx
))
except
NoAppException
as
e
:
# When an app couldn't be loaded, show the error message
# without the traceback.
click
.
secho
(
f
"
Error:
{
e
.
format_message
()
}
\n
"
,
err
=
True
,
fg
=
"
red
"
)
except
Exception
:
# When any other errors occurred during loading, show the
# full traceback.
click
.
secho
(
f
"
{
traceback
.
format_exc
()
}
\n
"
,
err
=
True
,
fg
=
"
red
"
)
return
sorted
(
rv
)
def
make_context
(
self
,
info_name
:
str
|
None
,
args
:
list
[
str
],
parent
:
click
.
Context
|
None
=
None
,
**
extra
:
t
.
Any
,
)
->
click
.
Context
:
# Set a flag to tell app.run to become a no-op. If app.run was
# not in a __name__ == __main__ guard, it would start the server
# when importing, blocking whatever command is being called.
os
.
environ
[
"
FLASK_RUN_FROM_CLI
"
]
=
"
true
"
# Attempt to load .env and .flask env files. The --env-file
# option can cause another file to be loaded.
if
get_load_dotenv
(
self
.
load_dotenv
):
load_dotenv
()
if
"
obj
"
not
in
extra
and
"
obj
"
not
in
self
.
context_settings
:
extra
[
"
obj
"
]
=
ScriptInfo
(
create_app
=
self
.
create_app
,
set_debug_flag
=
self
.
set_debug_flag
)
return
super
().
make_context
(
info_name
,
args
,
parent
=
parent
,
**
extra
)
def
parse_args
(
self
,
ctx
:
click
.
Context
,
args
:
list
[
str
])
->
list
[
str
]:
if
not
args
and
self
.
no_args_is_help
:
# Attempt to load --env-file and --app early in case they
# were given as env vars. Otherwise no_args_is_help will not
# see commands from app.cli.
_env_file_option
.
handle_parse_result
(
ctx
,
{},
[])
_app_option
.
handle_parse_result
(
ctx
,
{},
[])
return
super
().
parse_args
(
ctx
,
args
)
def
_path_is_ancestor
(
path
:
str
,
other
:
str
)
->
bool
:
"""
Take ``other`` and remove the length of ``path`` from it. Then join it
to ``path``. If it is the original value, ``path`` is an ancestor of
``other``.
"""
return
os
.
path
.
join
(
path
,
other
[
len
(
path
)
:].
lstrip
(
os
.
sep
))
==
other
def
load_dotenv
(
path
:
str
|
os
.
PathLike
[
str
]
|
None
=
None
)
->
bool
:
"""
Load
"
dotenv
"
files in order of precedence to set environment variables.
If an env var is already set it is not overwritten, so earlier files in the
list are preferred over later files.
This is a no-op if `python-dotenv`_ is not installed.
.. _python-dotenv: https://github.com/theskumar/python-dotenv#readme
:param path: Load the file at this location instead of searching.
:return: ``True`` if a file was loaded.
.. versionchanged:: 2.0
The current directory is not changed to the location of the
loaded file.
.. versionchanged:: 2.0
When loading the env files, set the default encoding to UTF-8.
.. versionchanged:: 1.1.0
Returns ``False`` when python-dotenv is not installed, or when
the given path isn
'
t a file.
.. versionadded:: 1.0
"""
try
:
import
dotenv
except
ImportError
:
if
path
or
os
.
path
.
isfile
(
"
.env
"
)
or
os
.
path
.
isfile
(
"
.flaskenv
"
):
click
.
secho
(
"
* Tip: There are .env or .flaskenv files present.
"
'
Do
"
pip install python-dotenv
"
to use them.
'
,
fg
=
"
yellow
"
,
err
=
True
,
)
return
False
# Always return after attempting to load a given path, don't load
# the default files.
if
path
is
not
None
:
if
os
.
path
.
isfile
(
path
):
return
dotenv
.
load_dotenv
(
path
,
encoding
=
"
utf-8
"
)
return
False
loaded
=
False
for
name
in
(
"
.env
"
,
"
.flaskenv
"
):
path
=
dotenv
.
find_dotenv
(
name
,
usecwd
=
True
)
if
not
path
:
continue
dotenv
.
load_dotenv
(
path
,
encoding
=
"
utf-8
"
)
loaded
=
True
return
loaded
# True if at least one file was located and loaded.
def
show_server_banner
(
debug
:
bool
,
app_import_path
:
str
|
None
)
->
None
:
"""
Show extra startup messages the first time the server is run,
ignoring the reloader.
"""
if
is_running_from_reloader
():
return
if
app_import_path
is
not
None
:
click
.
echo
(
f
"
* Serving Flask app
'
{
app_import_path
}
'"
)
if
debug
is
not
None
:
click
.
echo
(
f
"
* Debug mode:
{
'
on
'
if
debug
else
'
off
'
}
"
)
class
CertParamType
(
click
.
ParamType
):
"""
Click option type for the ``--cert`` option. Allows either an
existing file, the string ``
'
adhoc
'
``, or an import for a
:class:`~ssl.SSLContext` object.
"""
name
=
"
path
"
def
__init__
(
self
)
->
None
:
self
.
path_type
=
click
.
Path
(
exists
=
True
,
dir_okay
=
False
,
resolve_path
=
True
)
def
convert
(
self
,
value
:
t
.
Any
,
param
:
click
.
Parameter
|
None
,
ctx
:
click
.
Context
|
None
)
->
t
.
Any
:
try
:
import
ssl
except
ImportError
:
raise
click
.
BadParameter
(
'
Using
"
--cert
"
requires Python to be compiled with SSL support.
'
,
ctx
,
param
,
)
from
None
try
:
return
self
.
path_type
(
value
,
param
,
ctx
)
except
click
.
BadParameter
:
value
=
click
.
STRING
(
value
,
param
,
ctx
).
lower
()
if
value
==
"
adhoc
"
:
try
:
import
cryptography
# noqa: F401
except
ImportError
:
raise
click
.
BadParameter
(
"
Using ad-hoc certificates requires the cryptography library.
"
,
ctx
,
param
,
)
from
None
return
value
obj
=
import_string
(
value
,
silent
=
True
)
if
isinstance
(
obj
,
ssl
.
SSLContext
):
return
obj
raise
def
_validate_key
(
ctx
:
click
.
Context
,
param
:
click
.
Parameter
,
value
:
t
.
Any
)
->
t
.
Any
:
"""
The ``--key`` option must be specified when ``--cert`` is a file.
Modifies the ``cert`` param to be a ``(cert, key)`` pair if needed.
"""
cert
=
ctx
.
params
.
get
(
"
cert
"
)
is_adhoc
=
cert
==
"
adhoc
"
try
:
import
ssl
except
ImportError
:
is_context
=
False
else
:
is_context
=
isinstance
(
cert
,
ssl
.
SSLContext
)
if
value
is
not
None
:
if
is_adhoc
:
raise
click
.
BadParameter
(
'
When
"
--cert
"
is
"
adhoc
"
,
"
--key
"
is not used.
'
,
ctx
,
param
)
if
is_context
:
raise
click
.
BadParameter
(
'
When
"
--cert
"
is an SSLContext object,
"
--key
"
is not used.
'
,
ctx
,
param
,
)
if
not
cert
:
raise
click
.
BadParameter
(
'"
--cert
"
must also be specified.
'
,
ctx
,
param
)
ctx
.
params
[
"
cert
"
]
=
cert
,
value
else
:
if
cert
and
not
(
is_adhoc
or
is_context
):
raise
click
.
BadParameter
(
'
Required when using
"
--cert
"
.
'
,
ctx
,
param
)
return
value
class
SeparatedPathType
(
click
.
Path
):
"""
Click option type that accepts a list of values separated by the
OS
'
s path separator (``:``, ``;`` on Windows). Each value is
validated as a :class:`click.Path` type.
"""
def
convert
(
self
,
value
:
t
.
Any
,
param
:
click
.
Parameter
|
None
,
ctx
:
click
.
Context
|
None
)
->
t
.
Any
:
items
=
self
.
split_envvar_value
(
value
)
# can't call no-arg super() inside list comprehension until Python 3.12
super_convert
=
super
().
convert
return
[
super_convert
(
item
,
param
,
ctx
)
for
item
in
items
]
@click.command
(
"
run
"
,
short_help
=
"
Run a development server.
"
)
@click.option
(
"
--host
"
,
"
-h
"
,
default
=
"
127.0.0.1
"
,
help
=
"
The interface to bind to.
"
)
@click.option
(
"
--port
"
,
"
-p
"
,
default
=
5000
,
help
=
"
The port to bind to.
"
)
@click.option
(
"
--cert
"
,
type
=
CertParamType
(),
help
=
"
Specify a certificate file to use HTTPS.
"
,
is_eager
=
True
,
)
@click.option
(
"
--key
"
,
type
=
click
.
Path
(
exists
=
True
,
dir_okay
=
False
,
resolve_path
=
True
),
callback
=
_validate_key
,
expose_value
=
False
,
help
=
"
The key file to use when specifying a certificate.
"
,
)
@click.option
(
"
--reload/--no-reload
"
,
default
=
None
,
help
=
"
Enable or disable the reloader. By default the reloader
"
"
is active if debug is enabled.
"
,
)
@click.option
(
"
--debugger/--no-debugger
"
,
default
=
None
,
help
=
"
Enable or disable the debugger. By default the debugger
"
"
is active if debug is enabled.
"
,
)
@click.option
(
"
--with-threads/--without-threads
"
,
default
=
True
,
help
=
"
Enable or disable multithreading.
"
,
)
@click.option
(
"
--extra-files
"
,
default
=
None
,
type
=
SeparatedPathType
(),
help
=
(
"
Extra files that trigger a reload on change. Multiple paths
"
f
"
are separated by
{
os
.
path
.
pathsep
!r}
.
"
),
)
@click.option
(
"
--exclude-patterns
"
,
default
=
None
,
type
=
SeparatedPathType
(),
help
=
(
"
Files matching these fnmatch patterns will not trigger a reload
"
"
on change. Multiple patterns are separated by
"
f
"
{
os
.
path
.
pathsep
!r}
.
"
),
)
@pass_script_info
def
run_command
(
info
:
ScriptInfo
,
host
:
str
,
port
:
int
,
reload
:
bool
,
debugger
:
bool
,
with_threads
:
bool
,
cert
:
ssl
.
SSLContext
|
tuple
[
str
,
str
|
None
]
|
t
.
Literal
[
"
adhoc
"
]
|
None
,
extra_files
:
list
[
str
]
|
None
,
exclude_patterns
:
list
[
str
]
|
None
,
)
->
None
:
"""
Run a local development server.
This server is for development purposes only. It does not provide
the stability, security, or performance of production WSGI servers.
The reloader and debugger are enabled by default with the
'
--debug
'
option.
"""
try
:
app
:
WSGIApplication
=
info
.
load_app
()
except
Exception
as
e
:
if
is_running_from_reloader
():
# When reloading, print out the error immediately, but raise
# it later so the debugger or server can handle it.
traceback
.
print_exc
()
err
=
e
def
app
(
environ
:
WSGIEnvironment
,
start_response
:
StartResponse
)
->
cabc
.
Iterable
[
bytes
]:
raise
err
from
None
else
:
# When not reloading, raise the error immediately so the
# command fails.
raise
e
from
None
debug
=
get_debug_flag
()
if
reload
is
None
:
reload
=
debug
if
debugger
is
None
:
debugger
=
debug
show_server_banner
(
debug
,
info
.
app_import_path
)
run_simple
(
host
,
port
,
app
,
use_reloader
=
reload
,
use_debugger
=
debugger
,
threaded
=
with_threads
,
ssl_context
=
cert
,
extra_files
=
extra_files
,
exclude_patterns
=
exclude_patterns
,
)
run_command
.
params
.
insert
(
0
,
_debug_option
)
@click.command
(
"
shell
"
,
short_help
=
"
Run a shell in the app context.
"
)
@with_appcontext
def
shell_command
()
->
None
:
"""
Run an interactive Python shell in the context of a given
Flask application. The application will populate the default
namespace of this shell according to its configuration.
This is useful for executing small snippets of management code
without having to manually configure the application.
"""
import
code
banner
=
(
f
"
Python
{
sys
.
version
}
on
{
sys
.
platform
}
\n
"
f
"
App:
{
current_app
.
import_name
}
\n
"
f
"
Instance:
{
current_app
.
instance_path
}
"
)
ctx
:
dict
[
str
,
t
.
Any
]
=
{}
# Support the regular Python interpreter startup script if someone
# is using it.
startup
=
os
.
environ
.
get
(
"
PYTHONSTARTUP
"
)
if
startup
and
os
.
path
.
isfile
(
startup
):
with
open
(
startup
)
as
f
:
eval
(
compile
(
f
.
read
(),
startup
,
"
exec
"
),
ctx
)
ctx
.
update
(
current_app
.
make_shell_context
())
# Site, customize, or startup script can set a hook to call when
# entering interactive mode. The default one sets up readline with
# tab and history completion.
interactive_hook
=
getattr
(
sys
,
"
__interactivehook__
"
,
None
)
if
interactive_hook
is
not
None
:
try
:
import
readline
from
rlcompleter
import
Completer
except
ImportError
:
pass
else
:
# rlcompleter uses __main__.__dict__ by default, which is
# flask.__main__. Use the shell context instead.
readline
.
set_completer
(
Completer
(
ctx
).
complete
)
interactive_hook
()
code
.
interact
(
banner
=
banner
,
local
=
ctx
)
@click.command
(
"
routes
"
,
short_help
=
"
Show the routes for the app.
"
)
@click.option
(
"
--sort
"
,
"
-s
"
,
type
=
click
.
Choice
((
"
endpoint
"
,
"
methods
"
,
"
domain
"
,
"
rule
"
,
"
match
"
)),
default
=
"
endpoint
"
,
help
=
(
"
Method to sort routes by.
'
match
'
is the order that Flask will match routes
"
"
when dispatching a request.
"
),
)
@click.option
(
"
--all-methods
"
,
is_flag
=
True
,
help
=
"
Show HEAD and OPTIONS methods.
"
)
@with_appcontext
def
routes_command
(
sort
:
str
,
all_methods
:
bool
)
->
None
:
"""
Show all registered routes with endpoints and methods.
"""
rules
=
list
(
current_app
.
url_map
.
iter_rules
())
if
not
rules
:
click
.
echo
(
"
No routes were registered.
"
)
return
ignored_methods
=
set
()
if
all_methods
else
{
"
HEAD
"
,
"
OPTIONS
"
}
host_matching
=
current_app
.
url_map
.
host_matching
has_domain
=
any
(
rule
.
host
if
host_matching
else
rule
.
subdomain
for
rule
in
rules
)
rows
=
[]
for
rule
in
rules
:
row
=
[
rule
.
endpoint
,
"
,
"
.
join
(
sorted
((
rule
.
methods
or
set
())
-
ignored_methods
)),
]
if
has_domain
:
row
.
append
((
rule
.
host
if
host_matching
else
rule
.
subdomain
)
or
""
)
row
.
append
(
rule
.
rule
)
rows
.
append
(
row
)
headers
=
[
"
Endpoint
"
,
"
Methods
"
]
sorts
=
[
"
endpoint
"
,
"
methods
"
]
if
has_domain
:
headers
.
append
(
"
Host
"
if
host_matching
else
"
Subdomain
"
)
sorts
.
append
(
"
domain
"
)
headers
.
append
(
"
Rule
"
)
sorts
.
append
(
"
rule
"
)
try
:
rows
.
sort
(
key
=
itemgetter
(
sorts
.
index
(
sort
)))
except
ValueError
:
pass
rows
.
insert
(
0
,
headers
)
widths
=
[
max
(
len
(
row
[
i
])
for
row
in
rows
)
for
i
in
range
(
len
(
headers
))]
rows
.
insert
(
1
,
[
"
-
"
*
w
for
w
in
widths
])
template
=
"
"
.
join
(
f
"
{{
{
i
}
:<
{
w
}
}}
"
for
i
,
w
in
enumerate
(
widths
))
for
row
in
rows
:
click
.
echo
(
template
.
format
(
*
row
))
cli
=
FlaskGroup
(
name
=
"
flask
"
,
help
=
"""
\
A general utility script for Flask applications.
An application to load must be given with the
'
--app
'
option,
'
FLASK_APP
'
environment variable, or with a
'
wsgi.py
'
or
'
app.py
'
file
in the current directory.
"""
,
)
def
main
()
->
None
:
cli
.
main
()
if
__name__
==
"
__main__
"
:
main
()
src/main/java/gui_server/server-temp/venv/lib/python3.10/site-packages/flask/config.py
deleted
100644 → 0
View file @
34e4eb38
from
__future__
import
annotations
import
errno
import
json
import
os
import
types
import
typing
as
t
from
werkzeug.utils
import
import_string
if
t
.
TYPE_CHECKING
:
import
typing_extensions
as
te
from
.sansio.app
import
App
T
=
t
.
TypeVar
(
"
T
"
)
class
ConfigAttribute
(
t
.
Generic
[
T
]):
"""
Makes an attribute forward to the config
"""
def
__init__
(
self
,
name
:
str
,
get_converter
:
t
.
Callable
[[
t
.
Any
],
T
]
|
None
=
None
)
->
None
:
self
.
__name__
=
name
self
.
get_converter
=
get_converter
@t.overload
def
__get__
(
self
,
obj
:
None
,
owner
:
None
)
->
te
.
Self
:
...
@t.overload
def
__get__
(
self
,
obj
:
App
,
owner
:
type
[
App
])
->
T
:
...
def
__get__
(
self
,
obj
:
App
|
None
,
owner
:
type
[
App
]
|
None
=
None
)
->
T
|
te
.
Self
:
if
obj
is
None
:
return
self
rv
=
obj
.
config
[
self
.
__name__
]
if
self
.
get_converter
is
not
None
:
rv
=
self
.
get_converter
(
rv
)
return
rv
# type: ignore[no-any-return]
def
__set__
(
self
,
obj
:
App
,
value
:
t
.
Any
)
->
None
:
obj
.
config
[
self
.
__name__
]
=
value
class
Config
(
dict
):
# type: ignore[type-arg]
"""
Works exactly like a dict but provides ways to fill it from files
or special dictionaries. There are two common patterns to populate the
config.
Either you can fill the config from a config file::
app.config.from_pyfile(
'
yourconfig.cfg
'
)
Or alternatively you can define the configuration options in the
module that calls :meth:`from_object` or provide an import path to
a module that should be loaded. It is also possible to tell it to
use the same module and with that provide the configuration values
just before the call::
DEBUG = True
SECRET_KEY =
'
development key
'
app.config.from_object(__name__)
In both cases (loading from any Python file or loading from modules),
only uppercase keys are added to the config. This makes it possible to use
lowercase values in the config file for temporary values that are not added
to the config or to define the config keys in the same file that implements
the application.
Probably the most interesting way to load configurations is from an
environment variable pointing to a file::
app.config.from_envvar(
'
YOURAPPLICATION_SETTINGS
'
)
In this case before launching the application you have to set this
environment variable to the file you want to use. On Linux and OS X
use the export statement::
export YOURAPPLICATION_SETTINGS=
'
/path/to/config/file
'
On windows use `set` instead.
:param root_path: path to which files are read relative from. When the
config object is created by the application, this is
the application
'
s :attr:`~flask.Flask.root_path`.
:param defaults: an optional dictionary of default values
"""
def
__init__
(
self
,
root_path
:
str
|
os
.
PathLike
[
str
],
defaults
:
dict
[
str
,
t
.
Any
]
|
None
=
None
,
)
->
None
:
super
().
__init__
(
defaults
or
{})
self
.
root_path
=
root_path
def
from_envvar
(
self
,
variable_name
:
str
,
silent
:
bool
=
False
)
->
bool
:
"""
Loads a configuration from an environment variable pointing to
a configuration file. This is basically just a shortcut with nicer
error messages for this line of code::
app.config.from_pyfile(os.environ[
'
YOURAPPLICATION_SETTINGS
'
])
:param variable_name: name of the environment variable
:param silent: set to ``True`` if you want silent failure for missing
files.
:return: ``True`` if the file was loaded successfully.
"""
rv
=
os
.
environ
.
get
(
variable_name
)
if
not
rv
:
if
silent
:
return
False
raise
RuntimeError
(
f
"
The environment variable
{
variable_name
!r}
is not set
"
"
and as such configuration could not be loaded. Set
"
"
this variable and make it point to a configuration
"
"
file
"
)
return
self
.
from_pyfile
(
rv
,
silent
=
silent
)
def
from_prefixed_env
(
self
,
prefix
:
str
=
"
FLASK
"
,
*
,
loads
:
t
.
Callable
[[
str
],
t
.
Any
]
=
json
.
loads
)
->
bool
:
"""
Load any environment variables that start with ``FLASK_``,
dropping the prefix from the env key for the config key. Values
are passed through a loading function to attempt to convert them
to more specific types than strings.
Keys are loaded in :func:`sorted` order.
The default loading function attempts to parse values as any
valid JSON type, including dicts and lists.
Specific items in nested dicts can be set by separating the
keys with double underscores (``__``). If an intermediate key
doesn
'
t exist, it will be initialized to an empty dict.
:param prefix: Load env vars that start with this prefix,
separated with an underscore (``_``).
:param loads: Pass each string value to this function and use
the returned value as the config value. If any error is
raised it is ignored and the value remains a string. The
default is :func:`json.loads`.
.. versionadded:: 2.1
"""
prefix
=
f
"
{
prefix
}
_
"
len_prefix
=
len
(
prefix
)
for
key
in
sorted
(
os
.
environ
):
if
not
key
.
startswith
(
prefix
):
continue
value
=
os
.
environ
[
key
]
try
:
value
=
loads
(
value
)
except
Exception
:
# Keep the value as a string if loading failed.
pass
# Change to key.removeprefix(prefix) on Python >= 3.9.
key
=
key
[
len_prefix
:]
if
"
__
"
not
in
key
:
# A non-nested key, set directly.
self
[
key
]
=
value
continue
# Traverse nested dictionaries with keys separated by "__".
current
=
self
*
parts
,
tail
=
key
.
split
(
"
__
"
)
for
part
in
parts
:
# If an intermediate dict does not exist, create it.
if
part
not
in
current
:
current
[
part
]
=
{}
current
=
current
[
part
]
current
[
tail
]
=
value
return
True
def
from_pyfile
(
self
,
filename
:
str
|
os
.
PathLike
[
str
],
silent
:
bool
=
False
)
->
bool
:
"""
Updates the values in the config from a Python file. This function
behaves as if the file was imported as module with the
:meth:`from_object` function.
:param filename: the filename of the config. This can either be an
absolute filename or a filename relative to the
root path.
:param silent: set to ``True`` if you want silent failure for missing
files.
:return: ``True`` if the file was loaded successfully.
.. versionadded:: 0.7
`silent` parameter.
"""
filename
=
os
.
path
.
join
(
self
.
root_path
,
filename
)
d
=
types
.
ModuleType
(
"
config
"
)
d
.
__file__
=
filename
try
:
with
open
(
filename
,
mode
=
"
rb
"
)
as
config_file
:
exec
(
compile
(
config_file
.
read
(),
filename
,
"
exec
"
),
d
.
__dict__
)
except
OSError
as
e
:
if
silent
and
e
.
errno
in
(
errno
.
ENOENT
,
errno
.
EISDIR
,
errno
.
ENOTDIR
):
return
False
e
.
strerror
=
f
"
Unable to load configuration file (
{
e
.
strerror
}
)
"
raise
self
.
from_object
(
d
)
return
True
def
from_object
(
self
,
obj
:
object
|
str
)
->
None
:
"""
Updates the values from the given object. An object can be of one
of the following two types:
- a string: in this case the object with that name will be imported
- an actual object reference: that object is used directly
Objects are usually either modules or classes. :meth:`from_object`
loads only the uppercase attributes of the module/class. A ``dict``
object will not work with :meth:`from_object` because the keys of a
``dict`` are not attributes of the ``dict`` class.
Example of module-based configuration::
app.config.from_object(
'
yourapplication.default_config
'
)
from yourapplication import default_config
app.config.from_object(default_config)
Nothing is done to the object before loading. If the object is a
class and has ``@property`` attributes, it needs to be
instantiated before being passed to this method.
You should not use this function to load the actual configuration but
rather configuration defaults. The actual config should be loaded
with :meth:`from_pyfile` and ideally from a location not within the
package because the package might be installed system wide.
See :ref:`config-dev-prod` for an example of class-based configuration
using :meth:`from_object`.
:param obj: an import name or object
"""
if
isinstance
(
obj
,
str
):
obj
=
import_string
(
obj
)
for
key
in
dir
(
obj
):
if
key
.
isupper
():
self
[
key
]
=
getattr
(
obj
,
key
)
def
from_file
(
self
,
filename
:
str
|
os
.
PathLike
[
str
],
load
:
t
.
Callable
[[
t
.
IO
[
t
.
Any
]],
t
.
Mapping
[
str
,
t
.
Any
]],
silent
:
bool
=
False
,
text
:
bool
=
True
,
)
->
bool
:
"""
Update the values in the config from a file that is loaded
using the ``load`` parameter. The loaded data is passed to the
:meth:`from_mapping` method.
.. code-block:: python
import json
app.config.from_file(
"
config.json
"
, load=json.load)
import tomllib
app.config.from_file(
"
config.toml
"
, load=tomllib.load, text=False)
:param filename: The path to the data file. This can be an
absolute path or relative to the config root path.
:param load: A callable that takes a file handle and returns a
mapping of loaded data from the file.
:type load: ``Callable[[Reader], Mapping]`` where ``Reader``
implements a ``read`` method.
:param silent: Ignore the file if it doesn
'
t exist.
:param text: Open the file in text or binary mode.
:return: ``True`` if the file was loaded successfully.
.. versionchanged:: 2.3
The ``text`` parameter was added.
.. versionadded:: 2.0
"""
filename
=
os
.
path
.
join
(
self
.
root_path
,
filename
)
try
:
with
open
(
filename
,
"
r
"
if
text
else
"
rb
"
)
as
f
:
obj
=
load
(
f
)
except
OSError
as
e
:
if
silent
and
e
.
errno
in
(
errno
.
ENOENT
,
errno
.
EISDIR
):
return
False
e
.
strerror
=
f
"
Unable to load configuration file (
{
e
.
strerror
}
)
"
raise
return
self
.
from_mapping
(
obj
)
def
from_mapping
(
self
,
mapping
:
t
.
Mapping
[
str
,
t
.
Any
]
|
None
=
None
,
**
kwargs
:
t
.
Any
)
->
bool
:
"""
Updates the config like :meth:`update` ignoring items with
non-upper keys.
:return: Always returns ``True``.
.. versionadded:: 0.11
"""
mappings
:
dict
[
str
,
t
.
Any
]
=
{}
if
mapping
is
not
None
:
mappings
.
update
(
mapping
)
mappings
.
update
(
kwargs
)
for
key
,
value
in
mappings
.
items
():
if
key
.
isupper
():
self
[
key
]
=
value
return
True
def
get_namespace
(
self
,
namespace
:
str
,
lowercase
:
bool
=
True
,
trim_namespace
:
bool
=
True
)
->
dict
[
str
,
t
.
Any
]:
"""
Returns a dictionary containing a subset of configuration options
that match the specified namespace/prefix. Example usage::
app.config[
'
IMAGE_STORE_TYPE
'
] =
'
fs
'
app.config[
'
IMAGE_STORE_PATH
'
] =
'
/var/app/images
'
app.config[
'
IMAGE_STORE_BASE_URL
'
] =
'
http://img.website.com
'
image_store_config = app.config.get_namespace(
'
IMAGE_STORE_
'
)
The resulting dictionary `image_store_config` would look like::
{
'
type
'
:
'
fs
'
,
'
path
'
:
'
/var/app/images
'
,
'
base_url
'
:
'
http://img.website.com
'
}
This is often useful when configuration options map directly to
keyword arguments in functions or class constructors.
:param namespace: a configuration namespace
:param lowercase: a flag indicating if the keys of the resulting
dictionary should be lowercase
:param trim_namespace: a flag indicating if the keys of the resulting
dictionary should not include the namespace
.. versionadded:: 0.11
"""
rv
=
{}
for
k
,
v
in
self
.
items
():
if
not
k
.
startswith
(
namespace
):
continue
if
trim_namespace
:
key
=
k
[
len
(
namespace
)
:]
else
:
key
=
k
if
lowercase
:
key
=
key
.
lower
()
rv
[
key
]
=
v
return
rv
def
__repr__
(
self
)
->
str
:
return
f
"
<
{
type
(
self
).
__name__
}
{
dict
.
__repr__
(
self
)
}
>
"
src/main/java/gui_server/server-temp/venv/lib/python3.10/site-packages/flask/ctx.py
deleted
100644 → 0
View file @
34e4eb38
from
__future__
import
annotations
import
contextvars
import
sys
import
typing
as
t
from
functools
import
update_wrapper
from
types
import
TracebackType
from
werkzeug.exceptions
import
HTTPException
from
.
import
typing
as
ft
from
.globals
import
_cv_app
from
.globals
import
_cv_request
from
.signals
import
appcontext_popped
from
.signals
import
appcontext_pushed
if
t
.
TYPE_CHECKING
:
# pragma: no cover
from
_typeshed.wsgi
import
WSGIEnvironment
from
.app
import
Flask
from
.sessions
import
SessionMixin
from
.wrappers
import
Request
# a singleton sentinel value for parameter defaults
_sentinel
=
object
()
class
_AppCtxGlobals
:
"""
A plain object. Used as a namespace for storing data during an
application context.
Creating an app context automatically creates this object, which is
made available as the :data:`g` proxy.
.. describe::
'
key
'
in g
Check whether an attribute is present.
.. versionadded:: 0.10
.. describe:: iter(g)
Return an iterator over the attribute names.
.. versionadded:: 0.10
"""
# Define attr methods to let mypy know this is a namespace object
# that has arbitrary attributes.
def
__getattr__
(
self
,
name
:
str
)
->
t
.
Any
:
try
:
return
self
.
__dict__
[
name
]
except
KeyError
:
raise
AttributeError
(
name
)
from
None
def
__setattr__
(
self
,
name
:
str
,
value
:
t
.
Any
)
->
None
:
self
.
__dict__
[
name
]
=
value
def
__delattr__
(
self
,
name
:
str
)
->
None
:
try
:
del
self
.
__dict__
[
name
]
except
KeyError
:
raise
AttributeError
(
name
)
from
None
def
get
(
self
,
name
:
str
,
default
:
t
.
Any
|
None
=
None
)
->
t
.
Any
:
"""
Get an attribute by name, or a default value. Like
:meth:`dict.get`.
:param name: Name of attribute to get.
:param default: Value to return if the attribute is not present.
.. versionadded:: 0.10
"""
return
self
.
__dict__
.
get
(
name
,
default
)
def
pop
(
self
,
name
:
str
,
default
:
t
.
Any
=
_sentinel
)
->
t
.
Any
:
"""
Get and remove an attribute by name. Like :meth:`dict.pop`.
:param name: Name of attribute to pop.
:param default: Value to return if the attribute is not present,
instead of raising a ``KeyError``.
.. versionadded:: 0.11
"""
if
default
is
_sentinel
:
return
self
.
__dict__
.
pop
(
name
)
else
:
return
self
.
__dict__
.
pop
(
name
,
default
)
def
setdefault
(
self
,
name
:
str
,
default
:
t
.
Any
=
None
)
->
t
.
Any
:
"""
Get the value of an attribute if it is present, otherwise
set and return a default value. Like :meth:`dict.setdefault`.
:param name: Name of attribute to get.
:param default: Value to set and return if the attribute is not
present.
.. versionadded:: 0.11
"""
return
self
.
__dict__
.
setdefault
(
name
,
default
)
def
__contains__
(
self
,
item
:
str
)
->
bool
:
return
item
in
self
.
__dict__
def
__iter__
(
self
)
->
t
.
Iterator
[
str
]:
return
iter
(
self
.
__dict__
)
def
__repr__
(
self
)
->
str
:
ctx
=
_cv_app
.
get
(
None
)
if
ctx
is
not
None
:
return
f
"
<flask.g of
'
{
ctx
.
app
.
name
}
'
>
"
return
object
.
__repr__
(
self
)
def
after_this_request
(
f
:
ft
.
AfterRequestCallable
[
t
.
Any
],
)
->
ft
.
AfterRequestCallable
[
t
.
Any
]:
"""
Executes a function after this request. This is useful to modify
response objects. The function is passed the response object and has
to return the same or a new one.
Example::
@app.route(
'
/
'
)
def index():
@after_this_request
def add_header(response):
response.headers[
'
X-Foo
'
] =
'
Parachute
'
return response
return
'
Hello World!
'
This is more useful if a function other than the view function wants to
modify a response. For instance think of a decorator that wants to add
some headers without converting the return value into a response object.
.. versionadded:: 0.9
"""
ctx
=
_cv_request
.
get
(
None
)
if
ctx
is
None
:
raise
RuntimeError
(
"'
after_this_request
'
can only be used when a request
"
"
context is active, such as in a view function.
"
)
ctx
.
_after_request_functions
.
append
(
f
)
return
f
F
=
t
.
TypeVar
(
"
F
"
,
bound
=
t
.
Callable
[...,
t
.
Any
])
def
copy_current_request_context
(
f
:
F
)
->
F
:
"""
A helper function that decorates a function to retain the current
request context. This is useful when working with greenlets. The moment
the function is decorated a copy of the request context is created and
then pushed when the function is called. The current session is also
included in the copied request context.
Example::
import gevent
from flask import copy_current_request_context
@app.route(
'
/
'
)
def index():
@copy_current_request_context
def do_some_work():
# do some work here, it can access flask.request or
# flask.session like you would otherwise in the view function.
...
gevent
.
spawn
(
do_some_work
)
return
'
Regular response
'
.. versionadded:: 0.10
"""
ctx
=
_cv_request
.
get
(
None
)
if
ctx
is
None
:
raise
RuntimeError
(
"'
copy_current_request_context
'
can only be used when a
"
"
request context is active, such as in a view function.
"
)
ctx
=
ctx
.
copy
()
def
wrapper
(
*
args
:
t
.
Any
,
**
kwargs
:
t
.
Any
)
->
t
.
Any
:
with
ctx
:
# type: ignore[union-attr]
return
ctx
.
app
.
ensure_sync
(
f
)(
*
args
,
**
kwargs
)
# type: ignore[union-attr]
return
update_wrapper
(
wrapper
,
f
)
# type: ignore[return-value]
def
has_request_context
()
->
bool
:
"""
If you have code that wants to test if a request context is there or
not this function can be used. For instance, you may want to take advantage
of request information if the request object is available, but fail
silently if it is unavailable.
::
class User(db.Model):
def __init__(self, username, remote_addr=None):
self.username = username
if remote_addr is None and has_request_context():
remote_addr = request.remote_addr
self.remote_addr = remote_addr
Alternatively you can also just test any of the context bound objects
(such as :class:`request` or :class:`g`) for truthness::
class User(db.Model):
def __init__(self, username, remote_addr=None):
self.username = username
if remote_addr is None and request:
remote_addr = request.remote_addr
self.remote_addr = remote_addr
.. versionadded:: 0.7
"""
return
_cv_request
.
get
(
None
)
is
not
None
def
has_app_context
()
->
bool
:
"""
Works like :func:`has_request_context` but for the application
context. You can also just do a boolean check on the
:data:`current_app` object instead.
.. versionadded:: 0.9
"""
return
_cv_app
.
get
(
None
)
is
not
None
class
AppContext
:
"""
The app context contains application-specific information. An app
context is created and pushed at the beginning of each request if
one is not already active. An app context is also pushed when
running CLI commands.
"""
def
__init__
(
self
,
app
:
Flask
)
->
None
:
self
.
app
=
app
self
.
url_adapter
=
app
.
create_url_adapter
(
None
)
self
.
g
:
_AppCtxGlobals
=
app
.
app_ctx_globals_class
()
self
.
_cv_tokens
:
list
[
contextvars
.
Token
[
AppContext
]]
=
[]
def
push
(
self
)
->
None
:
"""
Binds the app context to the current context.
"""
self
.
_cv_tokens
.
append
(
_cv_app
.
set
(
self
))
appcontext_pushed
.
send
(
self
.
app
,
_async_wrapper
=
self
.
app
.
ensure_sync
)
def
pop
(
self
,
exc
:
BaseException
|
None
=
_sentinel
)
->
None
:
# type: ignore
"""
Pops the app context.
"""
try
:
if
len
(
self
.
_cv_tokens
)
==
1
:
if
exc
is
_sentinel
:
exc
=
sys
.
exc_info
()[
1
]
self
.
app
.
do_teardown_appcontext
(
exc
)
finally
:
ctx
=
_cv_app
.
get
()
_cv_app
.
reset
(
self
.
_cv_tokens
.
pop
())
if
ctx
is
not
self
:
raise
AssertionError
(
f
"
Popped wrong app context. (
{
ctx
!r}
instead of
{
self
!r}
)
"
)
appcontext_popped
.
send
(
self
.
app
,
_async_wrapper
=
self
.
app
.
ensure_sync
)
def
__enter__
(
self
)
->
AppContext
:
self
.
push
()
return
self
def
__exit__
(
self
,
exc_type
:
type
|
None
,
exc_value
:
BaseException
|
None
,
tb
:
TracebackType
|
None
,
)
->
None
:
self
.
pop
(
exc_value
)
class
RequestContext
:
"""
The request context contains per-request information. The Flask
app creates and pushes it at the beginning of the request, then pops
it at the end of the request. It will create the URL adapter and
request object for the WSGI environment provided.
Do not attempt to use this class directly, instead use
:meth:`~flask.Flask.test_request_context` and
:meth:`~flask.Flask.request_context` to create this object.
When the request context is popped, it will evaluate all the
functions registered on the application for teardown execution
(:meth:`~flask.Flask.teardown_request`).
The request context is automatically popped at the end of the
request. When using the interactive debugger, the context will be
restored so ``request`` is still accessible. Similarly, the test
client can preserve the context after the request ends. However,
teardown functions may already have closed some resources such as
database connections.
"""
def
__init__
(
self
,
app
:
Flask
,
environ
:
WSGIEnvironment
,
request
:
Request
|
None
=
None
,
session
:
SessionMixin
|
None
=
None
,
)
->
None
:
self
.
app
=
app
if
request
is
None
:
request
=
app
.
request_class
(
environ
)
request
.
json_module
=
app
.
json
self
.
request
:
Request
=
request
self
.
url_adapter
=
None
try
:
self
.
url_adapter
=
app
.
create_url_adapter
(
self
.
request
)
except
HTTPException
as
e
:
self
.
request
.
routing_exception
=
e
self
.
flashes
:
list
[
tuple
[
str
,
str
]]
|
None
=
None
self
.
session
:
SessionMixin
|
None
=
session
# Functions that should be executed after the request on the response
# object. These will be called before the regular "after_request"
# functions.
self
.
_after_request_functions
:
list
[
ft
.
AfterRequestCallable
[
t
.
Any
]]
=
[]
self
.
_cv_tokens
:
list
[
tuple
[
contextvars
.
Token
[
RequestContext
],
AppContext
|
None
]
]
=
[]
def
copy
(
self
)
->
RequestContext
:
"""
Creates a copy of this request context with the same request object.
This can be used to move a request context to a different greenlet.
Because the actual request object is the same this cannot be used to
move a request context to a different thread unless access to the
request object is locked.
.. versionadded:: 0.10
.. versionchanged:: 1.1
The current session object is used instead of reloading the original
data. This prevents `flask.session` pointing to an out-of-date object.
"""
return
self
.
__class__
(
self
.
app
,
environ
=
self
.
request
.
environ
,
request
=
self
.
request
,
session
=
self
.
session
,
)
def
match_request
(
self
)
->
None
:
"""
Can be overridden by a subclass to hook into the matching
of the request.
"""
try
:
result
=
self
.
url_adapter
.
match
(
return_rule
=
True
)
# type: ignore
self
.
request
.
url_rule
,
self
.
request
.
view_args
=
result
# type: ignore
except
HTTPException
as
e
:
self
.
request
.
routing_exception
=
e
def
push
(
self
)
->
None
:
# Before we push the request context we have to ensure that there
# is an application context.
app_ctx
=
_cv_app
.
get
(
None
)
if
app_ctx
is
None
or
app_ctx
.
app
is
not
self
.
app
:
app_ctx
=
self
.
app
.
app_context
()
app_ctx
.
push
()
else
:
app_ctx
=
None
self
.
_cv_tokens
.
append
((
_cv_request
.
set
(
self
),
app_ctx
))
# Open the session at the moment that the request context is available.
# This allows a custom open_session method to use the request context.
# Only open a new session if this is the first time the request was
# pushed, otherwise stream_with_context loses the session.
if
self
.
session
is
None
:
session_interface
=
self
.
app
.
session_interface
self
.
session
=
session_interface
.
open_session
(
self
.
app
,
self
.
request
)
if
self
.
session
is
None
:
self
.
session
=
session_interface
.
make_null_session
(
self
.
app
)
# Match the request URL after loading the session, so that the
# session is available in custom URL converters.
if
self
.
url_adapter
is
not
None
:
self
.
match_request
()
def
pop
(
self
,
exc
:
BaseException
|
None
=
_sentinel
)
->
None
:
# type: ignore
"""
Pops the request context and unbinds it by doing that. This will
also trigger the execution of functions registered by the
:meth:`~flask.Flask.teardown_request` decorator.
.. versionchanged:: 0.9
Added the `exc` argument.
"""
clear_request
=
len
(
self
.
_cv_tokens
)
==
1
try
:
if
clear_request
:
if
exc
is
_sentinel
:
exc
=
sys
.
exc_info
()[
1
]
self
.
app
.
do_teardown_request
(
exc
)
request_close
=
getattr
(
self
.
request
,
"
close
"
,
None
)
if
request_close
is
not
None
:
request_close
()
finally
:
ctx
=
_cv_request
.
get
()
token
,
app_ctx
=
self
.
_cv_tokens
.
pop
()
_cv_request
.
reset
(
token
)
# get rid of circular dependencies at the end of the request
# so that we don't require the GC to be active.
if
clear_request
:
ctx
.
request
.
environ
[
"
werkzeug.request
"
]
=
None
if
app_ctx
is
not
None
:
app_ctx
.
pop
(
exc
)
if
ctx
is
not
self
:
raise
AssertionError
(
f
"
Popped wrong request context. (
{
ctx
!r}
instead of
{
self
!r}
)
"
)
def
__enter__
(
self
)
->
RequestContext
:
self
.
push
()
return
self
def
__exit__
(
self
,
exc_type
:
type
|
None
,
exc_value
:
BaseException
|
None
,
tb
:
TracebackType
|
None
,
)
->
None
:
self
.
pop
(
exc_value
)
def
__repr__
(
self
)
->
str
:
return
(
f
"
<
{
type
(
self
).
__name__
}
{
self
.
request
.
url
!r}
"
f
"
[
{
self
.
request
.
method
}
] of
{
self
.
app
.
name
}
>
"
)
src/main/java/gui_server/server-temp/venv/lib/python3.10/site-packages/flask/debughelpers.py
deleted
100644 → 0
View file @
34e4eb38
from
__future__
import
annotations
import
typing
as
t
from
jinja2.loaders
import
BaseLoader
from
werkzeug.routing
import
RequestRedirect
from
.blueprints
import
Blueprint
from
.globals
import
request_ctx
from
.sansio.app
import
App
if
t
.
TYPE_CHECKING
:
from
.sansio.scaffold
import
Scaffold
from
.wrappers
import
Request
class
UnexpectedUnicodeError
(
AssertionError
,
UnicodeError
):
"""
Raised in places where we want some better error reporting for
unexpected unicode or binary data.
"""
class
DebugFilesKeyError
(
KeyError
,
AssertionError
):
"""
Raised from request.files during debugging. The idea is that it can
provide a better error message than just a generic KeyError/BadRequest.
"""
def
__init__
(
self
,
request
:
Request
,
key
:
str
)
->
None
:
form_matches
=
request
.
form
.
getlist
(
key
)
buf
=
[
f
"
You tried to access the file
{
key
!r}
in the request.files
"
"
dictionary but it does not exist. The mimetype for the
"
f
"
request is
{
request
.
mimetype
!r}
instead of
"
"
'
multipart/form-data
'
which means that no file contents
"
"
were transmitted. To fix this error you should provide
"
'
enctype=
"
multipart/form-data
"
in your form.
'
]
if
form_matches
:
names
=
"
,
"
.
join
(
repr
(
x
)
for
x
in
form_matches
)
buf
.
append
(
"
\n\n
The browser instead transmitted some file names.
"
f
"
This was submitted:
{
names
}
"
)
self
.
msg
=
""
.
join
(
buf
)
def
__str__
(
self
)
->
str
:
return
self
.
msg
class
FormDataRoutingRedirect
(
AssertionError
):
"""
This exception is raised in debug mode if a routing redirect
would cause the browser to drop the method or body. This happens
when method is not GET, HEAD or OPTIONS and the status code is not
307 or 308.
"""
def
__init__
(
self
,
request
:
Request
)
->
None
:
exc
=
request
.
routing_exception
assert
isinstance
(
exc
,
RequestRedirect
)
buf
=
[
f
"
A request was sent to
'
{
request
.
url
}
'
, but routing issued
"
f
"
a redirect to the canonical URL
'
{
exc
.
new_url
}
'
.
"
]
if
f
"
{
request
.
base_url
}
/
"
==
exc
.
new_url
.
partition
(
"
?
"
)[
0
]:
buf
.
append
(
"
The URL was defined with a trailing slash. Flask
"
"
will redirect to the URL with a trailing slash if it
"
"
was accessed without one.
"
)
buf
.
append
(
"
Send requests to the canonical URL, or use 307 or 308 for
"
"
routing redirects. Otherwise, browsers will drop form
"
"
data.
\n\n
"
"
This exception is only raised in debug mode.
"
)
super
().
__init__
(
""
.
join
(
buf
))
def
attach_enctype_error_multidict
(
request
:
Request
)
->
None
:
"""
Patch ``request.files.__getitem__`` to raise a descriptive error
about ``enctype=multipart/form-data``.
:param request: The request to patch.
:meta private:
"""
oldcls
=
request
.
files
.
__class__
class
newcls
(
oldcls
):
# type: ignore[valid-type, misc]
def
__getitem__
(
self
,
key
:
str
)
->
t
.
Any
:
try
:
return
super
().
__getitem__
(
key
)
except
KeyError
as
e
:
if
key
not
in
request
.
form
:
raise
raise
DebugFilesKeyError
(
request
,
key
).
with_traceback
(
e
.
__traceback__
)
from
None
newcls
.
__name__
=
oldcls
.
__name__
newcls
.
__module__
=
oldcls
.
__module__
request
.
files
.
__class__
=
newcls
def
_dump_loader_info
(
loader
:
BaseLoader
)
->
t
.
Iterator
[
str
]:
yield
f
"
class:
{
type
(
loader
).
__module__
}
.
{
type
(
loader
).
__name__
}
"
for
key
,
value
in
sorted
(
loader
.
__dict__
.
items
()):
if
key
.
startswith
(
"
_
"
):
continue
if
isinstance
(
value
,
(
tuple
,
list
)):
if
not
all
(
isinstance
(
x
,
str
)
for
x
in
value
):
continue
yield
f
"
{
key
}
:
"
for
item
in
value
:
yield
f
"
-
{
item
}
"
continue
elif
not
isinstance
(
value
,
(
str
,
int
,
float
,
bool
)):
continue
yield
f
"
{
key
}
:
{
value
!r}
"
def
explain_template_loading_attempts
(
app
:
App
,
template
:
str
,
attempts
:
list
[
tuple
[
BaseLoader
,
Scaffold
,
tuple
[
str
,
str
|
None
,
t
.
Callable
[[],
bool
]
|
None
]
|
None
,
]
],
)
->
None
:
"""
This should help developers understand what failed
"""
info
=
[
f
"
Locating template
{
template
!r}
:
"
]
total_found
=
0
blueprint
=
None
if
request_ctx
and
request_ctx
.
request
.
blueprint
is
not
None
:
blueprint
=
request_ctx
.
request
.
blueprint
for
idx
,
(
loader
,
srcobj
,
triple
)
in
enumerate
(
attempts
):
if
isinstance
(
srcobj
,
App
):
src_info
=
f
"
application
{
srcobj
.
import_name
!r}
"
elif
isinstance
(
srcobj
,
Blueprint
):
src_info
=
f
"
blueprint
{
srcobj
.
name
!r}
(
{
srcobj
.
import_name
}
)
"
else
:
src_info
=
repr
(
srcobj
)
info
.
append
(
f
"
{
idx
+
1
:
5
}
: trying loader of
{
src_info
}
"
)
for
line
in
_dump_loader_info
(
loader
):
info
.
append
(
f
"
{
line
}
"
)
if
triple
is
None
:
detail
=
"
no match
"
else
:
detail
=
f
"
found (
{
triple
[
1
]
or
'
<string>
'
!r}
)
"
total_found
+=
1
info
.
append
(
f
"
->
{
detail
}
"
)
seems_fishy
=
False
if
total_found
==
0
:
info
.
append
(
"
Error: the template could not be found.
"
)
seems_fishy
=
True
elif
total_found
>
1
:
info
.
append
(
"
Warning: multiple loaders returned a match for the template.
"
)
seems_fishy
=
True
if
blueprint
is
not
None
and
seems_fishy
:
info
.
append
(
"
The template was looked up from an endpoint that belongs
"
f
"
to the blueprint
{
blueprint
!r}
.
"
)
info
.
append
(
"
Maybe you did not place a template in the right folder?
"
)
info
.
append
(
"
See https://flask.palletsprojects.com/blueprints/#templates
"
)
app
.
logger
.
info
(
"
\n
"
.
join
(
info
))
src/main/java/gui_server/server-temp/venv/lib/python3.10/site-packages/flask/globals.py
deleted
100644 → 0
View file @
34e4eb38
from
__future__
import
annotations
import
typing
as
t
from
contextvars
import
ContextVar
from
werkzeug.local
import
LocalProxy
if
t
.
TYPE_CHECKING
:
# pragma: no cover
from
.app
import
Flask
from
.ctx
import
_AppCtxGlobals
from
.ctx
import
AppContext
from
.ctx
import
RequestContext
from
.sessions
import
SessionMixin
from
.wrappers
import
Request
_no_app_msg
=
"""
\
Working outside of application context.
This typically means that you attempted to use functionality that needed
the current application. To solve this, set up an application context
with app.app_context(). See the documentation for more information.
\
"""
_cv_app
:
ContextVar
[
AppContext
]
=
ContextVar
(
"
flask.app_ctx
"
)
app_ctx
:
AppContext
=
LocalProxy
(
# type: ignore[assignment]
_cv_app
,
unbound_message
=
_no_app_msg
)
current_app
:
Flask
=
LocalProxy
(
# type: ignore[assignment]
_cv_app
,
"
app
"
,
unbound_message
=
_no_app_msg
)
g
:
_AppCtxGlobals
=
LocalProxy
(
# type: ignore[assignment]
_cv_app
,
"
g
"
,
unbound_message
=
_no_app_msg
)
_no_req_msg
=
"""
\
Working outside of request context.
This typically means that you attempted to use functionality that needed
an active HTTP request. Consult the documentation on testing for
information about how to avoid this problem.
\
"""
_cv_request
:
ContextVar
[
RequestContext
]
=
ContextVar
(
"
flask.request_ctx
"
)
request_ctx
:
RequestContext
=
LocalProxy
(
# type: ignore[assignment]
_cv_request
,
unbound_message
=
_no_req_msg
)
request
:
Request
=
LocalProxy
(
# type: ignore[assignment]
_cv_request
,
"
request
"
,
unbound_message
=
_no_req_msg
)
session
:
SessionMixin
=
LocalProxy
(
# type: ignore[assignment]
_cv_request
,
"
session
"
,
unbound_message
=
_no_req_msg
)
src/main/java/gui_server/server-temp/venv/lib/python3.10/site-packages/flask/helpers.py
deleted
100644 → 0
View file @
34e4eb38
from
__future__
import
annotations
import
importlib.util
import
os
import
sys
import
typing
as
t
from
datetime
import
datetime
from
functools
import
lru_cache
from
functools
import
update_wrapper
import
werkzeug.utils
from
werkzeug.exceptions
import
abort
as
_wz_abort
from
werkzeug.utils
import
redirect
as
_wz_redirect
from
werkzeug.wrappers
import
Response
as
BaseResponse
from
.globals
import
_cv_request
from
.globals
import
current_app
from
.globals
import
request
from
.globals
import
request_ctx
from
.globals
import
session
from
.signals
import
message_flashed
if
t
.
TYPE_CHECKING
:
# pragma: no cover
from
.wrappers
import
Response
def
get_debug_flag
()
->
bool
:
"""
Get whether debug mode should be enabled for the app, indicated by the
:envvar:`FLASK_DEBUG` environment variable. The default is ``False``.
"""
val
=
os
.
environ
.
get
(
"
FLASK_DEBUG
"
)
return
bool
(
val
and
val
.
lower
()
not
in
{
"
0
"
,
"
false
"
,
"
no
"
})
def
get_load_dotenv
(
default
:
bool
=
True
)
->
bool
:
"""
Get whether the user has disabled loading default dotenv files by
setting :envvar:`FLASK_SKIP_DOTENV`. The default is ``True``, load
the files.
:param default: What to return if the env var isn
'
t set.
"""
val
=
os
.
environ
.
get
(
"
FLASK_SKIP_DOTENV
"
)
if
not
val
:
return
default
return
val
.
lower
()
in
(
"
0
"
,
"
false
"
,
"
no
"
)
def
stream_with_context
(
generator_or_function
:
t
.
Iterator
[
t
.
AnyStr
]
|
t
.
Callable
[...,
t
.
Iterator
[
t
.
AnyStr
]],
)
->
t
.
Iterator
[
t
.
AnyStr
]:
"""
Request contexts disappear when the response is started on the server.
This is done for efficiency reasons and to make it less likely to encounter
memory leaks with badly written WSGI middlewares. The downside is that if
you are using streamed responses, the generator cannot access request bound
information any more.
This function however can help you keep the context around for longer::
from flask import stream_with_context, request, Response
@app.route(
'
/stream
'
)
def streamed_response():
@stream_with_context
def generate():
yield
'
Hello
'
yield request.args[
'
name
'
]
yield
'
!
'
return Response(generate())
Alternatively it can also be used around a specific generator::
from flask import stream_with_context, request, Response
@app.route(
'
/stream
'
)
def streamed_response():
def generate():
yield
'
Hello
'
yield request.args[
'
name
'
]
yield
'
!
'
return Response(stream_with_context(generate()))
.. versionadded:: 0.9
"""
try
:
gen
=
iter
(
generator_or_function
)
# type: ignore[arg-type]
except
TypeError
:
def
decorator
(
*
args
:
t
.
Any
,
**
kwargs
:
t
.
Any
)
->
t
.
Any
:
gen
=
generator_or_function
(
*
args
,
**
kwargs
)
# type: ignore[operator]
return
stream_with_context
(
gen
)
return
update_wrapper
(
decorator
,
generator_or_function
)
# type: ignore[arg-type]
def
generator
()
->
t
.
Iterator
[
t
.
AnyStr
|
None
]:
ctx
=
_cv_request
.
get
(
None
)
if
ctx
is
None
:
raise
RuntimeError
(
"'
stream_with_context
'
can only be used when a request
"
"
context is active, such as in a view function.
"
)
with
ctx
:
# Dummy sentinel. Has to be inside the context block or we're
# not actually keeping the context around.
yield
None
# The try/finally is here so that if someone passes a WSGI level
# iterator in we're still running the cleanup logic. Generators
# don't need that because they are closed on their destruction
# automatically.
try
:
yield
from
gen
finally
:
if
hasattr
(
gen
,
"
close
"
):
gen
.
close
()
# The trick is to start the generator. Then the code execution runs until
# the first dummy None is yielded at which point the context was already
# pushed. This item is discarded. Then when the iteration continues the
# real generator is executed.
wrapped_g
=
generator
()
next
(
wrapped_g
)
return
wrapped_g
# type: ignore[return-value]
def
make_response
(
*
args
:
t
.
Any
)
->
Response
:
"""
Sometimes it is necessary to set additional headers in a view. Because
views do not have to return response objects but can return a value that
is converted into a response object by Flask itself, it becomes tricky to
add headers to it. This function can be called instead of using a return
and you will get a response object which you can use to attach headers.
If view looked like this and you want to add a new header::
def index():
return render_template(
'
index.html
'
, foo=42)
You can now do something like this::
def index():
response = make_response(render_template(
'
index.html
'
, foo=42))
response.headers[
'
X-Parachutes
'
] =
'
parachutes are cool
'
return response
This function accepts the very same arguments you can return from a
view function. This for example creates a response with a 404 error
code::
response = make_response(render_template(
'
not_found.html
'
), 404)
The other use case of this function is to force the return value of a
view function into a response which is helpful with view
decorators::
response = make_response(view_function())
response.headers[
'
X-Parachutes
'
] =
'
parachutes are cool
'
Internally this function does the following things:
- if no arguments are passed, it creates a new response argument
- if one argument is passed, :meth:`flask.Flask.make_response`
is invoked with it.
- if more than one argument is passed, the arguments are passed
to the :meth:`flask.Flask.make_response` function as tuple.
.. versionadded:: 0.6
"""
if
not
args
:
return
current_app
.
response_class
()
if
len
(
args
)
==
1
:
args
=
args
[
0
]
return
current_app
.
make_response
(
args
)
def
url_for
(
endpoint
:
str
,
*
,
_anchor
:
str
|
None
=
None
,
_method
:
str
|
None
=
None
,
_scheme
:
str
|
None
=
None
,
_external
:
bool
|
None
=
None
,
**
values
:
t
.
Any
,
)
->
str
:
"""
Generate a URL to the given endpoint with the given values.
This requires an active request or application context, and calls
:meth:`current_app.url_for() <flask.Flask.url_for>`. See that method
for full documentation.
:param endpoint: The endpoint name associated with the URL to
generate. If this starts with a ``.``, the current blueprint
name (if any) will be used.
:param _anchor: If given, append this as ``#anchor`` to the URL.
:param _method: If given, generate the URL associated with this
method for the endpoint.
:param _scheme: If given, the URL will have this scheme if it is
external.
:param _external: If given, prefer the URL to be internal (False) or
require it to be external (True). External URLs include the
scheme and domain. When not in an active request, URLs are
external by default.
:param values: Values to use for the variable parts of the URL rule.
Unknown keys are appended as query string arguments, like
``?a=b&c=d``.
.. versionchanged:: 2.2
Calls ``current_app.url_for``, allowing an app to override the
behavior.
.. versionchanged:: 0.10
The ``_scheme`` parameter was added.
.. versionchanged:: 0.9
The ``_anchor`` and ``_method`` parameters were added.
.. versionchanged:: 0.9
Calls ``app.handle_url_build_error`` on build errors.
"""
return
current_app
.
url_for
(
endpoint
,
_anchor
=
_anchor
,
_method
=
_method
,
_scheme
=
_scheme
,
_external
=
_external
,
**
values
,
)
def
redirect
(
location
:
str
,
code
:
int
=
302
,
Response
:
type
[
BaseResponse
]
|
None
=
None
)
->
BaseResponse
:
"""
Create a redirect response object.
If :data:`~flask.current_app` is available, it will use its
:meth:`~flask.Flask.redirect` method, otherwise it will use
:func:`werkzeug.utils.redirect`.
:param location: The URL to redirect to.
:param code: The status code for the redirect.
:param Response: The response class to use. Not used when
``current_app`` is active, which uses ``app.response_class``.
.. versionadded:: 2.2
Calls ``current_app.redirect`` if available instead of always
using Werkzeug
'
s default ``redirect``.
"""
if
current_app
:
return
current_app
.
redirect
(
location
,
code
=
code
)
return
_wz_redirect
(
location
,
code
=
code
,
Response
=
Response
)
def
abort
(
code
:
int
|
BaseResponse
,
*
args
:
t
.
Any
,
**
kwargs
:
t
.
Any
)
->
t
.
NoReturn
:
"""
Raise an :exc:`~werkzeug.exceptions.HTTPException` for the given
status code.
If :data:`~flask.current_app` is available, it will call its
:attr:`~flask.Flask.aborter` object, otherwise it will use
:func:`werkzeug.exceptions.abort`.
:param code: The status code for the exception, which must be
registered in ``app.aborter``.
:param args: Passed to the exception.
:param kwargs: Passed to the exception.
.. versionadded:: 2.2
Calls ``current_app.aborter`` if available instead of always
using Werkzeug
'
s default ``abort``.
"""
if
current_app
:
current_app
.
aborter
(
code
,
*
args
,
**
kwargs
)
_wz_abort
(
code
,
*
args
,
**
kwargs
)
def
get_template_attribute
(
template_name
:
str
,
attribute
:
str
)
->
t
.
Any
:
"""
Loads a macro (or variable) a template exports. This can be used to
invoke a macro from within Python code. If you for example have a
template named :file:`_cider.html` with the following contents:
.. sourcecode:: html+jinja
{% macro hello(name) %}Hello {{ name }}!{% endmacro %}
You can access this from Python code like this::
hello = get_template_attribute(
'
_cider.html
'
,
'
hello
'
)
return hello(
'
World
'
)
.. versionadded:: 0.2
:param template_name: the name of the template
:param attribute: the name of the variable of macro to access
"""
return
getattr
(
current_app
.
jinja_env
.
get_template
(
template_name
).
module
,
attribute
)
def
flash
(
message
:
str
,
category
:
str
=
"
message
"
)
->
None
:
"""
Flashes a message to the next request. In order to remove the
flashed message from the session and to display it to the user,
the template has to call :func:`get_flashed_messages`.
.. versionchanged:: 0.3
`category` parameter added.
:param message: the message to be flashed.
:param category: the category for the message. The following values
are recommended: ``
'
message
'
`` for any kind of message,
``
'
error
'
`` for errors, ``
'
info
'
`` for information
messages and ``
'
warning
'
`` for warnings. However any
kind of string can be used as category.
"""
# Original implementation:
#
# session.setdefault('_flashes', []).append((category, message))
#
# This assumed that changes made to mutable structures in the session are
# always in sync with the session object, which is not true for session
# implementations that use external storage for keeping their keys/values.
flashes
=
session
.
get
(
"
_flashes
"
,
[])
flashes
.
append
((
category
,
message
))
session
[
"
_flashes
"
]
=
flashes
app
=
current_app
.
_get_current_object
()
# type: ignore
message_flashed
.
send
(
app
,
_async_wrapper
=
app
.
ensure_sync
,
message
=
message
,
category
=
category
,
)
def
get_flashed_messages
(
with_categories
:
bool
=
False
,
category_filter
:
t
.
Iterable
[
str
]
=
()
)
->
list
[
str
]
|
list
[
tuple
[
str
,
str
]]:
"""
Pulls all flashed messages from the session and returns them.
Further calls in the same request to the function will return
the same messages. By default just the messages are returned,
but when `with_categories` is set to ``True``, the return value will
be a list of tuples in the form ``(category, message)`` instead.
Filter the flashed messages to one or more categories by providing those
categories in `category_filter`. This allows rendering categories in
separate html blocks. The `with_categories` and `category_filter`
arguments are distinct:
* `with_categories` controls whether categories are returned with message
text (``True`` gives a tuple, where ``False`` gives just the message text).
* `category_filter` filters the messages down to only those matching the
provided categories.
See :doc:`/patterns/flashing` for examples.
.. versionchanged:: 0.3
`with_categories` parameter added.
.. versionchanged:: 0.9
`category_filter` parameter added.
:param with_categories: set to ``True`` to also receive categories.
:param category_filter: filter of categories to limit return values. Only
categories in the list will be returned.
"""
flashes
=
request_ctx
.
flashes
if
flashes
is
None
:
flashes
=
session
.
pop
(
"
_flashes
"
)
if
"
_flashes
"
in
session
else
[]
request_ctx
.
flashes
=
flashes
if
category_filter
:
flashes
=
list
(
filter
(
lambda
f
:
f
[
0
]
in
category_filter
,
flashes
))
if
not
with_categories
:
return
[
x
[
1
]
for
x
in
flashes
]
return
flashes
def
_prepare_send_file_kwargs
(
**
kwargs
:
t
.
Any
)
->
dict
[
str
,
t
.
Any
]:
if
kwargs
.
get
(
"
max_age
"
)
is
None
:
kwargs
[
"
max_age
"
]
=
current_app
.
get_send_file_max_age
kwargs
.
update
(
environ
=
request
.
environ
,
use_x_sendfile
=
current_app
.
config
[
"
USE_X_SENDFILE
"
],
response_class
=
current_app
.
response_class
,
_root_path
=
current_app
.
root_path
,
# type: ignore
)
return
kwargs
def
send_file
(
path_or_file
:
os
.
PathLike
[
t
.
AnyStr
]
|
str
|
t
.
BinaryIO
,
mimetype
:
str
|
None
=
None
,
as_attachment
:
bool
=
False
,
download_name
:
str
|
None
=
None
,
conditional
:
bool
=
True
,
etag
:
bool
|
str
=
True
,
last_modified
:
datetime
|
int
|
float
|
None
=
None
,
max_age
:
None
|
(
int
|
t
.
Callable
[[
str
|
None
],
int
|
None
])
=
None
,
)
->
Response
:
"""
Send the contents of a file to the client.
The first argument can be a file path or a file-like object. Paths
are preferred in most cases because Werkzeug can manage the file and
get extra information from the path. Passing a file-like object
requires that the file is opened in binary mode, and is mostly
useful when building a file in memory with :class:`io.BytesIO`.
Never pass file paths provided by a user. The path is assumed to be
trusted, so a user could craft a path to access a file you didn
'
t
intend. Use :func:`send_from_directory` to safely serve
user-requested paths from within a directory.
If the WSGI server sets a ``file_wrapper`` in ``environ``, it is
used, otherwise Werkzeug
'
s built-in wrapper is used. Alternatively,
if the HTTP server supports ``X-Sendfile``, configuring Flask with
``USE_X_SENDFILE = True`` will tell the server to send the given
path, which is much more efficient than reading it in Python.
:param path_or_file: The path to the file to send, relative to the
current working directory if a relative path is given.
Alternatively, a file-like object opened in binary mode. Make
sure the file pointer is seeked to the start of the data.
:param mimetype: The MIME type to send for the file. If not
provided, it will try to detect it from the file name.
:param as_attachment: Indicate to a browser that it should offer to
save the file instead of displaying it.
:param download_name: The default name browsers will use when saving
the file. Defaults to the passed file name.
:param conditional: Enable conditional and range responses based on
request headers. Requires passing a file path and ``environ``.
:param etag: Calculate an ETag for the file, which requires passing
a file path. Can also be a string to use instead.
:param last_modified: The last modified time to send for the file,
in seconds. If not provided, it will try to detect it from the
file path.
:param max_age: How long the client should cache the file, in
seconds. If set, ``Cache-Control`` will be ``public``, otherwise
it will be ``no-cache`` to prefer conditional caching.
.. versionchanged:: 2.0
``download_name`` replaces the ``attachment_filename``
parameter. If ``as_attachment=False``, it is passed with
``Content-Disposition: inline`` instead.
.. versionchanged:: 2.0
``max_age`` replaces the ``cache_timeout`` parameter.
``conditional`` is enabled and ``max_age`` is not set by
default.
.. versionchanged:: 2.0
``etag`` replaces the ``add_etags`` parameter. It can be a
string to use instead of generating one.
.. versionchanged:: 2.0
Passing a file-like object that inherits from
:class:`~io.TextIOBase` will raise a :exc:`ValueError` rather
than sending an empty file.
.. versionadded:: 2.0
Moved the implementation to Werkzeug. This is now a wrapper to
pass some Flask-specific arguments.
.. versionchanged:: 1.1
``filename`` may be a :class:`~os.PathLike` object.
.. versionchanged:: 1.1
Passing a :class:`~io.BytesIO` object supports range requests.
.. versionchanged:: 1.0.3
Filenames are encoded with ASCII instead of Latin-1 for broader
compatibility with WSGI servers.
.. versionchanged:: 1.0
UTF-8 filenames as specified in :rfc:`2231` are supported.
.. versionchanged:: 0.12
The filename is no longer automatically inferred from file
objects. If you want to use automatic MIME and etag support,
pass a filename via ``filename_or_fp`` or
``attachment_filename``.
.. versionchanged:: 0.12
``attachment_filename`` is preferred over ``filename`` for MIME
detection.
.. versionchanged:: 0.9
``cache_timeout`` defaults to
:meth:`Flask.get_send_file_max_age`.
.. versionchanged:: 0.7
MIME guessing and etag support for file-like objects was
removed because it was unreliable. Pass a filename if you are
able to, otherwise attach an etag yourself.
.. versionchanged:: 0.5
The ``add_etags``, ``cache_timeout`` and ``conditional``
parameters were added. The default behavior is to add etags.
.. versionadded:: 0.2
"""
return
werkzeug
.
utils
.
send_file
(
# type: ignore[return-value]
**
_prepare_send_file_kwargs
(
path_or_file
=
path_or_file
,
environ
=
request
.
environ
,
mimetype
=
mimetype
,
as_attachment
=
as_attachment
,
download_name
=
download_name
,
conditional
=
conditional
,
etag
=
etag
,
last_modified
=
last_modified
,
max_age
=
max_age
,
)
)
def
send_from_directory
(
directory
:
os
.
PathLike
[
str
]
|
str
,
path
:
os
.
PathLike
[
str
]
|
str
,
**
kwargs
:
t
.
Any
,
)
->
Response
:
"""
Send a file from within a directory using :func:`send_file`.
.. code-block:: python
@app.route(
"
/uploads/<path:name>
"
)
def download_file(name):
return send_from_directory(
app.config[
'
UPLOAD_FOLDER
'
], name, as_attachment=True
)
This is a secure way to serve files from a folder, such as static
files or uploads. Uses :func:`~werkzeug.security.safe_join` to
ensure the path coming from the client is not maliciously crafted to
point outside the specified directory.
If the final path does not point to an existing regular file,
raises a 404 :exc:`~werkzeug.exceptions.NotFound` error.
:param directory: The directory that ``path`` must be located under,
relative to the current application
'
s root path.
:param path: The path to the file to send, relative to
``directory``.
:param kwargs: Arguments to pass to :func:`send_file`.
.. versionchanged:: 2.0
``path`` replaces the ``filename`` parameter.
.. versionadded:: 2.0
Moved the implementation to Werkzeug. This is now a wrapper to
pass some Flask-specific arguments.
.. versionadded:: 0.5
"""
return
werkzeug
.
utils
.
send_from_directory
(
# type: ignore[return-value]
directory
,
path
,
**
_prepare_send_file_kwargs
(
**
kwargs
)
)
def
get_root_path
(
import_name
:
str
)
->
str
:
"""
Find the root path of a package, or the path that contains a
module. If it cannot be found, returns the current working
directory.
Not to be confused with the value returned by :func:`find_package`.
:meta private:
"""
# Module already imported and has a file attribute. Use that first.
mod
=
sys
.
modules
.
get
(
import_name
)
if
mod
is
not
None
and
hasattr
(
mod
,
"
__file__
"
)
and
mod
.
__file__
is
not
None
:
return
os
.
path
.
dirname
(
os
.
path
.
abspath
(
mod
.
__file__
))
# Next attempt: check the loader.
try
:
spec
=
importlib
.
util
.
find_spec
(
import_name
)
if
spec
is
None
:
raise
ValueError
except
(
ImportError
,
ValueError
):
loader
=
None
else
:
loader
=
spec
.
loader
# Loader does not exist or we're referring to an unloaded main
# module or a main module without path (interactive sessions), go
# with the current working directory.
if
loader
is
None
:
return
os
.
getcwd
()
if
hasattr
(
loader
,
"
get_filename
"
):
filepath
=
loader
.
get_filename
(
import_name
)
else
:
# Fall back to imports.
__import__
(
import_name
)
mod
=
sys
.
modules
[
import_name
]
filepath
=
getattr
(
mod
,
"
__file__
"
,
None
)
# If we don't have a file path it might be because it is a
# namespace package. In this case pick the root path from the
# first module that is contained in the package.
if
filepath
is
None
:
raise
RuntimeError
(
"
No root path can be found for the provided module
"
f
"
{
import_name
!r}
. This can happen because the module
"
"
came from an import hook that does not provide file
"
"
name information or because it
'
s a namespace package.
"
"
In this case the root path needs to be explicitly
"
"
provided.
"
)
# filepath is import_name.py for a module, or __init__.py for a package.
return
os
.
path
.
dirname
(
os
.
path
.
abspath
(
filepath
))
# type: ignore[no-any-return]
@lru_cache
(
maxsize
=
None
)
def
_split_blueprint_path
(
name
:
str
)
->
list
[
str
]:
out
:
list
[
str
]
=
[
name
]
if
"
.
"
in
name
:
out
.
extend
(
_split_blueprint_path
(
name
.
rpartition
(
"
.
"
)[
0
]))
return
out
src/main/java/gui_server/server-temp/venv/lib/python3.10/site-packages/flask/json/__init__.py
deleted
100644 → 0
View file @
34e4eb38
from
__future__
import
annotations
import
json
as
_json
import
typing
as
t
from
..globals
import
current_app
from
.provider
import
_default
if
t
.
TYPE_CHECKING
:
# pragma: no cover
from
..wrappers
import
Response
def
dumps
(
obj
:
t
.
Any
,
**
kwargs
:
t
.
Any
)
->
str
:
"""
Serialize data as JSON.
If :data:`~flask.current_app` is available, it will use its
:meth:`app.json.dumps() <flask.json.provider.JSONProvider.dumps>`
method, otherwise it will use :func:`json.dumps`.
:param obj: The data to serialize.
:param kwargs: Arguments passed to the ``dumps`` implementation.
.. versionchanged:: 2.3
The ``app`` parameter was removed.
.. versionchanged:: 2.2
Calls ``current_app.json.dumps``, allowing an app to override
the behavior.
.. versionchanged:: 2.0.2
:class:`decimal.Decimal` is supported by converting to a string.
.. versionchanged:: 2.0
``encoding`` will be removed in Flask 2.1.
.. versionchanged:: 1.0.3
``app`` can be passed directly, rather than requiring an app
context for configuration.
"""
if
current_app
:
return
current_app
.
json
.
dumps
(
obj
,
**
kwargs
)
kwargs
.
setdefault
(
"
default
"
,
_default
)
return
_json
.
dumps
(
obj
,
**
kwargs
)
def
dump
(
obj
:
t
.
Any
,
fp
:
t
.
IO
[
str
],
**
kwargs
:
t
.
Any
)
->
None
:
"""
Serialize data as JSON and write to a file.
If :data:`~flask.current_app` is available, it will use its
:meth:`app.json.dump() <flask.json.provider.JSONProvider.dump>`
method, otherwise it will use :func:`json.dump`.
:param obj: The data to serialize.
:param fp: A file opened for writing text. Should use the UTF-8
encoding to be valid JSON.
:param kwargs: Arguments passed to the ``dump`` implementation.
.. versionchanged:: 2.3
The ``app`` parameter was removed.
.. versionchanged:: 2.2
Calls ``current_app.json.dump``, allowing an app to override
the behavior.
.. versionchanged:: 2.0
Writing to a binary file, and the ``encoding`` argument, will be
removed in Flask 2.1.
"""
if
current_app
:
current_app
.
json
.
dump
(
obj
,
fp
,
**
kwargs
)
else
:
kwargs
.
setdefault
(
"
default
"
,
_default
)
_json
.
dump
(
obj
,
fp
,
**
kwargs
)
def
loads
(
s
:
str
|
bytes
,
**
kwargs
:
t
.
Any
)
->
t
.
Any
:
"""
Deserialize data as JSON.
If :data:`~flask.current_app` is available, it will use its
:meth:`app.json.loads() <flask.json.provider.JSONProvider.loads>`
method, otherwise it will use :func:`json.loads`.
:param s: Text or UTF-8 bytes.
:param kwargs: Arguments passed to the ``loads`` implementation.
.. versionchanged:: 2.3
The ``app`` parameter was removed.
.. versionchanged:: 2.2
Calls ``current_app.json.loads``, allowing an app to override
the behavior.
.. versionchanged:: 2.0
``encoding`` will be removed in Flask 2.1. The data must be a
string or UTF-8 bytes.
.. versionchanged:: 1.0.3
``app`` can be passed directly, rather than requiring an app
context for configuration.
"""
if
current_app
:
return
current_app
.
json
.
loads
(
s
,
**
kwargs
)
return
_json
.
loads
(
s
,
**
kwargs
)
def
load
(
fp
:
t
.
IO
[
t
.
AnyStr
],
**
kwargs
:
t
.
Any
)
->
t
.
Any
:
"""
Deserialize data as JSON read from a file.
If :data:`~flask.current_app` is available, it will use its
:meth:`app.json.load() <flask.json.provider.JSONProvider.load>`
method, otherwise it will use :func:`json.load`.
:param fp: A file opened for reading text or UTF-8 bytes.
:param kwargs: Arguments passed to the ``load`` implementation.
.. versionchanged:: 2.3
The ``app`` parameter was removed.
.. versionchanged:: 2.2
Calls ``current_app.json.load``, allowing an app to override
the behavior.
.. versionchanged:: 2.2
The ``app`` parameter will be removed in Flask 2.3.
.. versionchanged:: 2.0
``encoding`` will be removed in Flask 2.1. The file must be text
mode, or binary mode with UTF-8 bytes.
"""
if
current_app
:
return
current_app
.
json
.
load
(
fp
,
**
kwargs
)
return
_json
.
load
(
fp
,
**
kwargs
)
def
jsonify
(
*
args
:
t
.
Any
,
**
kwargs
:
t
.
Any
)
->
Response
:
"""
Serialize the given arguments as JSON, and return a
:class:`~flask.Response` object with the ``application/json``
mimetype. A dict or list returned from a view will be converted to a
JSON response automatically without needing to call this.
This requires an active request or application context, and calls
:meth:`app.json.response() <flask.json.provider.JSONProvider.response>`.
In debug mode, the output is formatted with indentation to make it
easier to read. This may also be controlled by the provider.
Either positional or keyword arguments can be given, not both.
If no arguments are given, ``None`` is serialized.
:param args: A single value to serialize, or multiple values to
treat as a list to serialize.
:param kwargs: Treat as a dict to serialize.
.. versionchanged:: 2.2
Calls ``current_app.json.response``, allowing an app to override
the behavior.
.. versionchanged:: 2.0.2
:class:`decimal.Decimal` is supported by converting to a string.
.. versionchanged:: 0.11
Added support for serializing top-level arrays. This was a
security risk in ancient browsers. See :ref:`security-json`.
.. versionadded:: 0.2
"""
return
current_app
.
json
.
response
(
*
args
,
**
kwargs
)
# type: ignore[return-value]
src/main/java/gui_server/server-temp/venv/lib/python3.10/site-packages/flask/json/provider.py
deleted
100644 → 0
View file @
34e4eb38
from
__future__
import
annotations
import
dataclasses
import
decimal
import
json
import
typing
as
t
import
uuid
import
weakref
from
datetime
import
date
from
werkzeug.http
import
http_date
if
t
.
TYPE_CHECKING
:
# pragma: no cover
from
werkzeug.sansio.response
import
Response
from
..sansio.app
import
App
class
JSONProvider
:
"""
A standard set of JSON operations for an application. Subclasses
of this can be used to customize JSON behavior or use different
JSON libraries.
To implement a provider for a specific library, subclass this base
class and implement at least :meth:`dumps` and :meth:`loads`. All
other methods have default implementations.
To use a different provider, either subclass ``Flask`` and set
:attr:`~flask.Flask.json_provider_class` to a provider class, or set
:attr:`app.json <flask.Flask.json>` to an instance of the class.
:param app: An application instance. This will be stored as a
:class:`weakref.proxy` on the :attr:`_app` attribute.
.. versionadded:: 2.2
"""
def
__init__
(
self
,
app
:
App
)
->
None
:
self
.
_app
:
App
=
weakref
.
proxy
(
app
)
def
dumps
(
self
,
obj
:
t
.
Any
,
**
kwargs
:
t
.
Any
)
->
str
:
"""
Serialize data as JSON.
:param obj: The data to serialize.
:param kwargs: May be passed to the underlying JSON library.
"""
raise
NotImplementedError
def
dump
(
self
,
obj
:
t
.
Any
,
fp
:
t
.
IO
[
str
],
**
kwargs
:
t
.
Any
)
->
None
:
"""
Serialize data as JSON and write to a file.
:param obj: The data to serialize.
:param fp: A file opened for writing text. Should use the UTF-8
encoding to be valid JSON.
:param kwargs: May be passed to the underlying JSON library.
"""
fp
.
write
(
self
.
dumps
(
obj
,
**
kwargs
))
def
loads
(
self
,
s
:
str
|
bytes
,
**
kwargs
:
t
.
Any
)
->
t
.
Any
:
"""
Deserialize data as JSON.
:param s: Text or UTF-8 bytes.
:param kwargs: May be passed to the underlying JSON library.
"""
raise
NotImplementedError
def
load
(
self
,
fp
:
t
.
IO
[
t
.
AnyStr
],
**
kwargs
:
t
.
Any
)
->
t
.
Any
:
"""
Deserialize data as JSON read from a file.
:param fp: A file opened for reading text or UTF-8 bytes.
:param kwargs: May be passed to the underlying JSON library.
"""
return
self
.
loads
(
fp
.
read
(),
**
kwargs
)
def
_prepare_response_obj
(
self
,
args
:
tuple
[
t
.
Any
,
...],
kwargs
:
dict
[
str
,
t
.
Any
]
)
->
t
.
Any
:
if
args
and
kwargs
:
raise
TypeError
(
"
app.json.response() takes either args or kwargs, not both
"
)
if
not
args
and
not
kwargs
:
return
None
if
len
(
args
)
==
1
:
return
args
[
0
]
return
args
or
kwargs
def
response
(
self
,
*
args
:
t
.
Any
,
**
kwargs
:
t
.
Any
)
->
Response
:
"""
Serialize the given arguments as JSON, and return a
:class:`~flask.Response` object with the ``application/json``
mimetype.
The :func:`~flask.json.jsonify` function calls this method for
the current application.
Either positional or keyword arguments can be given, not both.
If no arguments are given, ``None`` is serialized.
:param args: A single value to serialize, or multiple values to
treat as a list to serialize.
:param kwargs: Treat as a dict to serialize.
"""
obj
=
self
.
_prepare_response_obj
(
args
,
kwargs
)
return
self
.
_app
.
response_class
(
self
.
dumps
(
obj
),
mimetype
=
"
application/json
"
)
def
_default
(
o
:
t
.
Any
)
->
t
.
Any
:
if
isinstance
(
o
,
date
):
return
http_date
(
o
)
if
isinstance
(
o
,
(
decimal
.
Decimal
,
uuid
.
UUID
)):
return
str
(
o
)
if
dataclasses
and
dataclasses
.
is_dataclass
(
o
):
return
dataclasses
.
asdict
(
o
)
if
hasattr
(
o
,
"
__html__
"
):
return
str
(
o
.
__html__
())
raise
TypeError
(
f
"
Object of type
{
type
(
o
).
__name__
}
is not JSON serializable
"
)
class
DefaultJSONProvider
(
JSONProvider
):
"""
Provide JSON operations using Python
'
s built-in :mod:`json`
library. Serializes the following additional data types:
- :class:`datetime.datetime` and :class:`datetime.date` are
serialized to :rfc:`822` strings. This is the same as the HTTP
date format.
- :class:`uuid.UUID` is serialized to a string.
- :class:`dataclasses.dataclass` is passed to
:func:`dataclasses.asdict`.
- :class:`~markupsafe.Markup` (or any object with a ``__html__``
method) will call the ``__html__`` method to get a string.
"""
default
:
t
.
Callable
[[
t
.
Any
],
t
.
Any
]
=
staticmethod
(
_default
)
# type: ignore[assignment]
"""
Apply this function to any object that :meth:`json.dumps` does
not know how to serialize. It should return a valid JSON type or
raise a ``TypeError``.
"""
ensure_ascii
=
True
"""
Replace non-ASCII characters with escape sequences. This may be
more compatible with some clients, but can be disabled for better
performance and size.
"""
sort_keys
=
True
"""
Sort the keys in any serialized dicts. This may be useful for
some caching situations, but can be disabled for better performance.
When enabled, keys must all be strings, they are not converted
before sorting.
"""
compact
:
bool
|
None
=
None
"""
If ``True``, or ``None`` out of debug mode, the :meth:`response`
output will not add indentation, newlines, or spaces. If ``False``,
or ``None`` in debug mode, it will use a non-compact representation.
"""
mimetype
=
"
application/json
"
"""
The mimetype set in :meth:`response`.
"""
def
dumps
(
self
,
obj
:
t
.
Any
,
**
kwargs
:
t
.
Any
)
->
str
:
"""
Serialize data as JSON to a string.
Keyword arguments are passed to :func:`json.dumps`. Sets some
parameter defaults from the :attr:`default`,
:attr:`ensure_ascii`, and :attr:`sort_keys` attributes.
:param obj: The data to serialize.
:param kwargs: Passed to :func:`json.dumps`.
"""
kwargs
.
setdefault
(
"
default
"
,
self
.
default
)
kwargs
.
setdefault
(
"
ensure_ascii
"
,
self
.
ensure_ascii
)
kwargs
.
setdefault
(
"
sort_keys
"
,
self
.
sort_keys
)
return
json
.
dumps
(
obj
,
**
kwargs
)
def
loads
(
self
,
s
:
str
|
bytes
,
**
kwargs
:
t
.
Any
)
->
t
.
Any
:
"""
Deserialize data as JSON from a string or bytes.
:param s: Text or UTF-8 bytes.
:param kwargs: Passed to :func:`json.loads`.
"""
return
json
.
loads
(
s
,
**
kwargs
)
def
response
(
self
,
*
args
:
t
.
Any
,
**
kwargs
:
t
.
Any
)
->
Response
:
"""
Serialize the given arguments as JSON, and return a
:class:`~flask.Response` object with it. The response mimetype
will be
"
application/json
"
and can be changed with
:attr:`mimetype`.
If :attr:`compact` is ``False`` or debug mode is enabled, the
output will be formatted to be easier to read.
Either positional or keyword arguments can be given, not both.
If no arguments are given, ``None`` is serialized.
:param args: A single value to serialize, or multiple values to
treat as a list to serialize.
:param kwargs: Treat as a dict to serialize.
"""
obj
=
self
.
_prepare_response_obj
(
args
,
kwargs
)
dump_args
:
dict
[
str
,
t
.
Any
]
=
{}
if
(
self
.
compact
is
None
and
self
.
_app
.
debug
)
or
self
.
compact
is
False
:
dump_args
.
setdefault
(
"
indent
"
,
2
)
else
:
dump_args
.
setdefault
(
"
separators
"
,
(
"
,
"
,
"
:
"
))
return
self
.
_app
.
response_class
(
f
"
{
self
.
dumps
(
obj
,
**
dump_args
)
}
\n
"
,
mimetype
=
self
.
mimetype
)
src/main/java/gui_server/server-temp/venv/lib/python3.10/site-packages/flask/json/tag.py
deleted
100644 → 0
View file @
34e4eb38
"""
Tagged JSON
~~~~~~~~~~~
A compact representation for lossless serialization of non-standard JSON
types. :class:`~flask.sessions.SecureCookieSessionInterface` uses this
to serialize the session data, but it may be useful in other places. It
can be extended to support other types.
.. autoclass:: TaggedJSONSerializer
:members:
.. autoclass:: JSONTag
:members:
Let
'
s see an example that adds support for
:class:`~collections.OrderedDict`. Dicts don
'
t have an order in JSON, so
to handle this we will dump the items as a list of ``[key, value]``
pairs. Subclass :class:`JSONTag` and give it the new key ``
'
od
'
`` to
identify the type. The session serializer processes dicts first, so
insert the new tag at the front of the order since ``OrderedDict`` must
be processed before ``dict``.
.. code-block:: python
from flask.json.tag import JSONTag
class TagOrderedDict(JSONTag):
__slots__ = (
'
serializer
'
,)
key =
'
od
'
def check(self, value):
return isinstance(value, OrderedDict)
def to_json(self, value):
return [[k, self.serializer.tag(v)] for k, v in iteritems(value)]
def to_python(self, value):
return OrderedDict(value)
app.session_interface.serializer.register(TagOrderedDict, index=0)
"""
from
__future__
import
annotations
import
typing
as
t
from
base64
import
b64decode
from
base64
import
b64encode
from
datetime
import
datetime
from
uuid
import
UUID
from
markupsafe
import
Markup
from
werkzeug.http
import
http_date
from
werkzeug.http
import
parse_date
from
..json
import
dumps
from
..json
import
loads
class
JSONTag
:
"""
Base class for defining type tags for :class:`TaggedJSONSerializer`.
"""
__slots__
=
(
"
serializer
"
,)
#: The tag to mark the serialized object with. If empty, this tag is
#: only used as an intermediate step during tagging.
key
:
str
=
""
def
__init__
(
self
,
serializer
:
TaggedJSONSerializer
)
->
None
:
"""
Create a tagger for the given serializer.
"""
self
.
serializer
=
serializer
def
check
(
self
,
value
:
t
.
Any
)
->
bool
:
"""
Check if the given value should be tagged by this tag.
"""
raise
NotImplementedError
def
to_json
(
self
,
value
:
t
.
Any
)
->
t
.
Any
:
"""
Convert the Python object to an object that is a valid JSON type.
The tag will be added later.
"""
raise
NotImplementedError
def
to_python
(
self
,
value
:
t
.
Any
)
->
t
.
Any
:
"""
Convert the JSON representation back to the correct type. The tag
will already be removed.
"""
raise
NotImplementedError
def
tag
(
self
,
value
:
t
.
Any
)
->
dict
[
str
,
t
.
Any
]:
"""
Convert the value to a valid JSON type and add the tag structure
around it.
"""
return
{
self
.
key
:
self
.
to_json
(
value
)}
class
TagDict
(
JSONTag
):
"""
Tag for 1-item dicts whose only key matches a registered tag.
Internally, the dict key is suffixed with `__`, and the suffix is removed
when deserializing.
"""
__slots__
=
()
key
=
"
di
"
def
check
(
self
,
value
:
t
.
Any
)
->
bool
:
return
(
isinstance
(
value
,
dict
)
and
len
(
value
)
==
1
and
next
(
iter
(
value
))
in
self
.
serializer
.
tags
)
def
to_json
(
self
,
value
:
t
.
Any
)
->
t
.
Any
:
key
=
next
(
iter
(
value
))
return
{
f
"
{
key
}
__
"
:
self
.
serializer
.
tag
(
value
[
key
])}
def
to_python
(
self
,
value
:
t
.
Any
)
->
t
.
Any
:
key
=
next
(
iter
(
value
))
return
{
key
[:
-
2
]:
value
[
key
]}
class
PassDict
(
JSONTag
):
__slots__
=
()
def
check
(
self
,
value
:
t
.
Any
)
->
bool
:
return
isinstance
(
value
,
dict
)
def
to_json
(
self
,
value
:
t
.
Any
)
->
t
.
Any
:
# JSON objects may only have string keys, so don't bother tagging the
# key here.
return
{
k
:
self
.
serializer
.
tag
(
v
)
for
k
,
v
in
value
.
items
()}
tag
=
to_json
class
TagTuple
(
JSONTag
):
__slots__
=
()
key
=
"
t
"
def
check
(
self
,
value
:
t
.
Any
)
->
bool
:
return
isinstance
(
value
,
tuple
)
def
to_json
(
self
,
value
:
t
.
Any
)
->
t
.
Any
:
return
[
self
.
serializer
.
tag
(
item
)
for
item
in
value
]
def
to_python
(
self
,
value
:
t
.
Any
)
->
t
.
Any
:
return
tuple
(
value
)
class
PassList
(
JSONTag
):
__slots__
=
()
def
check
(
self
,
value
:
t
.
Any
)
->
bool
:
return
isinstance
(
value
,
list
)
def
to_json
(
self
,
value
:
t
.
Any
)
->
t
.
Any
:
return
[
self
.
serializer
.
tag
(
item
)
for
item
in
value
]
tag
=
to_json
class
TagBytes
(
JSONTag
):
__slots__
=
()
key
=
"
b
"
def
check
(
self
,
value
:
t
.
Any
)
->
bool
:
return
isinstance
(
value
,
bytes
)
def
to_json
(
self
,
value
:
t
.
Any
)
->
t
.
Any
:
return
b64encode
(
value
).
decode
(
"
ascii
"
)
def
to_python
(
self
,
value
:
t
.
Any
)
->
t
.
Any
:
return
b64decode
(
value
)
class
TagMarkup
(
JSONTag
):
"""
Serialize anything matching the :class:`~markupsafe.Markup` API by
having a ``__html__`` method to the result of that method. Always
deserializes to an instance of :class:`~markupsafe.Markup`.
"""
__slots__
=
()
key
=
"
m
"
def
check
(
self
,
value
:
t
.
Any
)
->
bool
:
return
callable
(
getattr
(
value
,
"
__html__
"
,
None
))
def
to_json
(
self
,
value
:
t
.
Any
)
->
t
.
Any
:
return
str
(
value
.
__html__
())
def
to_python
(
self
,
value
:
t
.
Any
)
->
t
.
Any
:
return
Markup
(
value
)
class
TagUUID
(
JSONTag
):
__slots__
=
()
key
=
"
u
"
def
check
(
self
,
value
:
t
.
Any
)
->
bool
:
return
isinstance
(
value
,
UUID
)
def
to_json
(
self
,
value
:
t
.
Any
)
->
t
.
Any
:
return
value
.
hex
def
to_python
(
self
,
value
:
t
.
Any
)
->
t
.
Any
:
return
UUID
(
value
)
class
TagDateTime
(
JSONTag
):
__slots__
=
()
key
=
"
d
"
def
check
(
self
,
value
:
t
.
Any
)
->
bool
:
return
isinstance
(
value
,
datetime
)
def
to_json
(
self
,
value
:
t
.
Any
)
->
t
.
Any
:
return
http_date
(
value
)
def
to_python
(
self
,
value
:
t
.
Any
)
->
t
.
Any
:
return
parse_date
(
value
)
class
TaggedJSONSerializer
:
"""
Serializer that uses a tag system to compactly represent objects that
are not JSON types. Passed as the intermediate serializer to
:class:`itsdangerous.Serializer`.
The following extra types are supported:
* :class:`dict`
* :class:`tuple`
* :class:`bytes`
* :class:`~markupsafe.Markup`
* :class:`~uuid.UUID`
* :class:`~datetime.datetime`
"""
__slots__
=
(
"
tags
"
,
"
order
"
)
#: Tag classes to bind when creating the serializer. Other tags can be
#: added later using :meth:`~register`.
default_tags
=
[
TagDict
,
PassDict
,
TagTuple
,
PassList
,
TagBytes
,
TagMarkup
,
TagUUID
,
TagDateTime
,
]
def
__init__
(
self
)
->
None
:
self
.
tags
:
dict
[
str
,
JSONTag
]
=
{}
self
.
order
:
list
[
JSONTag
]
=
[]
for
cls
in
self
.
default_tags
:
self
.
register
(
cls
)
def
register
(
self
,
tag_class
:
type
[
JSONTag
],
force
:
bool
=
False
,
index
:
int
|
None
=
None
,
)
->
None
:
"""
Register a new tag with this serializer.
:param tag_class: tag class to register. Will be instantiated with this
serializer instance.
:param force: overwrite an existing tag. If false (default), a
:exc:`KeyError` is raised.
:param index: index to insert the new tag in the tag order. Useful when
the new tag is a special case of an existing tag. If ``None``
(default), the tag is appended to the end of the order.
:raise KeyError: if the tag key is already registered and ``force`` is
not true.
"""
tag
=
tag_class
(
self
)
key
=
tag
.
key
if
key
:
if
not
force
and
key
in
self
.
tags
:
raise
KeyError
(
f
"
Tag
'
{
key
}
'
is already registered.
"
)
self
.
tags
[
key
]
=
tag
if
index
is
None
:
self
.
order
.
append
(
tag
)
else
:
self
.
order
.
insert
(
index
,
tag
)
def
tag
(
self
,
value
:
t
.
Any
)
->
t
.
Any
:
"""
Convert a value to a tagged representation if necessary.
"""
for
tag
in
self
.
order
:
if
tag
.
check
(
value
):
return
tag
.
tag
(
value
)
return
value
def
untag
(
self
,
value
:
dict
[
str
,
t
.
Any
])
->
t
.
Any
:
"""
Convert a tagged representation back to the original type.
"""
if
len
(
value
)
!=
1
:
return
value
key
=
next
(
iter
(
value
))
if
key
not
in
self
.
tags
:
return
value
return
self
.
tags
[
key
].
to_python
(
value
[
key
])
def
_untag_scan
(
self
,
value
:
t
.
Any
)
->
t
.
Any
:
if
isinstance
(
value
,
dict
):
# untag each item recursively
value
=
{
k
:
self
.
_untag_scan
(
v
)
for
k
,
v
in
value
.
items
()}
# untag the dict itself
value
=
self
.
untag
(
value
)
elif
isinstance
(
value
,
list
):
# untag each item recursively
value
=
[
self
.
_untag_scan
(
item
)
for
item
in
value
]
return
value
def
dumps
(
self
,
value
:
t
.
Any
)
->
str
:
"""
Tag the value and dump it to a compact JSON string.
"""
return
dumps
(
self
.
tag
(
value
),
separators
=
(
"
,
"
,
"
:
"
))
def
loads
(
self
,
value
:
str
)
->
t
.
Any
:
"""
Load data from a JSON string and deserialized any tagged objects.
"""
return
self
.
_untag_scan
(
loads
(
value
))
src/main/java/gui_server/server-temp/venv/lib/python3.10/site-packages/flask/logging.py
deleted
100644 → 0
View file @
34e4eb38
from
__future__
import
annotations
import
logging
import
sys
import
typing
as
t
from
werkzeug.local
import
LocalProxy
from
.globals
import
request
if
t
.
TYPE_CHECKING
:
# pragma: no cover
from
.sansio.app
import
App
@LocalProxy
def
wsgi_errors_stream
()
->
t
.
TextIO
:
"""
Find the most appropriate error stream for the application. If a request
is active, log to ``wsgi.errors``, otherwise use ``sys.stderr``.
If you configure your own :class:`logging.StreamHandler`, you may want to
use this for the stream. If you are using file or dict configuration and
can
'
t import this directly, you can refer to it as
``ext://flask.logging.wsgi_errors_stream``.
"""
if
request
:
return
request
.
environ
[
"
wsgi.errors
"
]
# type: ignore[no-any-return]
return
sys
.
stderr
def
has_level_handler
(
logger
:
logging
.
Logger
)
->
bool
:
"""
Check if there is a handler in the logging chain that will handle the
given logger
'
s :meth:`effective level <~logging.Logger.getEffectiveLevel>`.
"""
level
=
logger
.
getEffectiveLevel
()
current
=
logger
while
current
:
if
any
(
handler
.
level
<=
level
for
handler
in
current
.
handlers
):
return
True
if
not
current
.
propagate
:
break
current
=
current
.
parent
# type: ignore
return
False
#: Log messages to :func:`~flask.logging.wsgi_errors_stream` with the format
#: ``[%(asctime)s] %(levelname)s in %(module)s: %(message)s``.
default_handler
=
logging
.
StreamHandler
(
wsgi_errors_stream
)
# type: ignore
default_handler
.
setFormatter
(
logging
.
Formatter
(
"
[%(asctime)s] %(levelname)s in %(module)s: %(message)s
"
)
)
def
create_logger
(
app
:
App
)
->
logging
.
Logger
:
"""
Get the Flask app
'
s logger and configure it if needed.
The logger name will be the same as
:attr:`app.import_name <flask.Flask.name>`.
When :attr:`~flask.Flask.debug` is enabled, set the logger level to
:data:`logging.DEBUG` if it is not set.
If there is no handler for the logger
'
s effective level, add a
:class:`~logging.StreamHandler` for
:func:`~flask.logging.wsgi_errors_stream` with a basic format.
"""
logger
=
logging
.
getLogger
(
app
.
name
)
if
app
.
debug
and
not
logger
.
level
:
logger
.
setLevel
(
logging
.
DEBUG
)
if
not
has_level_handler
(
logger
):
logger
.
addHandler
(
default_handler
)
return
logger
src/main/java/gui_server/server-temp/venv/lib/python3.10/site-packages/flask/py.typed
deleted
100644 → 0
View file @
34e4eb38
src/main/java/gui_server/server-temp/venv/lib/python3.10/site-packages/flask/sansio/README.md
deleted
100644 → 0
View file @
34e4eb38
# Sansio
This folder contains code that can be used by alternative Flask
implementations, for example Quart. The code therefore cannot do any
IO, nor be part of a likely IO path. Finally this code cannot use the
Flask globals.
src/main/java/gui_server/server-temp/venv/lib/python3.10/site-packages/flask/sansio/app.py
deleted
100644 → 0
View file @
34e4eb38
from
__future__
import
annotations
import
logging
import
os
import
sys
import
typing
as
t
from
datetime
import
timedelta
from
itertools
import
chain
from
werkzeug.exceptions
import
Aborter
from
werkzeug.exceptions
import
BadRequest
from
werkzeug.exceptions
import
BadRequestKeyError
from
werkzeug.routing
import
BuildError
from
werkzeug.routing
import
Map
from
werkzeug.routing
import
Rule
from
werkzeug.sansio.response
import
Response
from
werkzeug.utils
import
cached_property
from
werkzeug.utils
import
redirect
as
_wz_redirect
from
..
import
typing
as
ft
from
..config
import
Config
from
..config
import
ConfigAttribute
from
..ctx
import
_AppCtxGlobals
from
..helpers
import
_split_blueprint_path
from
..helpers
import
get_debug_flag
from
..json.provider
import
DefaultJSONProvider
from
..json.provider
import
JSONProvider
from
..logging
import
create_logger
from
..templating
import
DispatchingJinjaLoader
from
..templating
import
Environment
from
.scaffold
import
_endpoint_from_view_func
from
.scaffold
import
find_package
from
.scaffold
import
Scaffold
from
.scaffold
import
setupmethod
if
t
.
TYPE_CHECKING
:
# pragma: no cover
from
werkzeug.wrappers
import
Response
as
BaseResponse
from
..testing
import
FlaskClient
from
..testing
import
FlaskCliRunner
from
.blueprints
import
Blueprint
T_shell_context_processor
=
t
.
TypeVar
(
"
T_shell_context_processor
"
,
bound
=
ft
.
ShellContextProcessorCallable
)
T_teardown
=
t
.
TypeVar
(
"
T_teardown
"
,
bound
=
ft
.
TeardownCallable
)
T_template_filter
=
t
.
TypeVar
(
"
T_template_filter
"
,
bound
=
ft
.
TemplateFilterCallable
)
T_template_global
=
t
.
TypeVar
(
"
T_template_global
"
,
bound
=
ft
.
TemplateGlobalCallable
)
T_template_test
=
t
.
TypeVar
(
"
T_template_test
"
,
bound
=
ft
.
TemplateTestCallable
)
def
_make_timedelta
(
value
:
timedelta
|
int
|
None
)
->
timedelta
|
None
:
if
value
is
None
or
isinstance
(
value
,
timedelta
):
return
value
return
timedelta
(
seconds
=
value
)
class
App
(
Scaffold
):
"""
The flask object implements a WSGI application and acts as the central
object. It is passed the name of the module or package of the
application. Once it is created it will act as a central registry for
the view functions, the URL rules, template configuration and much more.
The name of the package is used to resolve resources from inside the
package or the folder the module is contained in depending on if the
package parameter resolves to an actual python package (a folder with
an :file:`__init__.py` file inside) or a standard module (just a ``.py`` file).
For more information about resource loading, see :func:`open_resource`.
Usually you create a :class:`Flask` instance in your main module or
in the :file:`__init__.py` file of your package like this::
from flask import Flask
app = Flask(__name__)
.. admonition:: About the First Parameter
The idea of the first parameter is to give Flask an idea of what
belongs to your application. This name is used to find resources
on the filesystem, can be used by extensions to improve debugging
information and a lot more.
So it
'
s important what you provide there. If you are using a single
module, `__name__` is always the correct value. If you however are
using a package, it
'
s usually recommended to hardcode the name of
your package there.
For example if your application is defined in :file:`yourapplication/app.py`
you should create it with one of the two versions below::
app = Flask(
'
yourapplication
'
)
app = Flask(__name__.split(
'
.
'
)[0])
Why is that? The application will work even with `__name__`, thanks
to how resources are looked up. However it will make debugging more
painful. Certain extensions can make assumptions based on the
import name of your application. For example the Flask-SQLAlchemy
extension will look for the code in your application that triggered
an SQL query in debug mode. If the import name is not properly set
up, that debugging information is lost. (For example it would only
pick up SQL queries in `yourapplication.app` and not
`yourapplication.views.frontend`)
.. versionadded:: 0.7
The `static_url_path`, `static_folder`, and `template_folder`
parameters were added.
.. versionadded:: 0.8
The `instance_path` and `instance_relative_config` parameters were
added.
.. versionadded:: 0.11
The `root_path` parameter was added.
.. versionadded:: 1.0
The ``host_matching`` and ``static_host`` parameters were added.
.. versionadded:: 1.0
The ``subdomain_matching`` parameter was added. Subdomain
matching needs to be enabled manually now. Setting
:data:`SERVER_NAME` does not implicitly enable it.
:param import_name: the name of the application package
:param static_url_path: can be used to specify a different path for the
static files on the web. Defaults to the name
of the `static_folder` folder.
:param static_folder: The folder with static files that is served at
``static_url_path``. Relative to the application ``root_path``
or an absolute path. Defaults to ``
'
static
'
``.
:param static_host: the host to use when adding the static route.
Defaults to None. Required when using ``host_matching=True``
with a ``static_folder`` configured.
:param host_matching: set ``url_map.host_matching`` attribute.
Defaults to False.
:param subdomain_matching: consider the subdomain relative to
:data:`SERVER_NAME` when matching routes. Defaults to False.
:param template_folder: the folder that contains the templates that should
be used by the application. Defaults to
``
'
templates
'
`` folder in the root path of the
application.
:param instance_path: An alternative instance path for the application.
By default the folder ``
'
instance
'
`` next to the
package or module is assumed to be the instance
path.
:param instance_relative_config: if set to ``True`` relative filenames
for loading the config are assumed to
be relative to the instance path instead
of the application root.
:param root_path: The path to the root of the application files.
This should only be set manually when it can
'
t be detected
automatically, such as for namespace packages.
"""
#: The class of the object assigned to :attr:`aborter`, created by
#: :meth:`create_aborter`. That object is called by
#: :func:`flask.abort` to raise HTTP errors, and can be
#: called directly as well.
#:
#: Defaults to :class:`werkzeug.exceptions.Aborter`.
#:
#: .. versionadded:: 2.2
aborter_class
=
Aborter
#: The class that is used for the Jinja environment.
#:
#: .. versionadded:: 0.11
jinja_environment
=
Environment
#: The class that is used for the :data:`~flask.g` instance.
#:
#: Example use cases for a custom class:
#:
#: 1. Store arbitrary attributes on flask.g.
#: 2. Add a property for lazy per-request database connectors.
#: 3. Return None instead of AttributeError on unexpected attributes.
#: 4. Raise exception if an unexpected attr is set, a "controlled" flask.g.
#:
#: In Flask 0.9 this property was called `request_globals_class` but it
#: was changed in 0.10 to :attr:`app_ctx_globals_class` because the
#: flask.g object is now application context scoped.
#:
#: .. versionadded:: 0.10
app_ctx_globals_class
=
_AppCtxGlobals
#: The class that is used for the ``config`` attribute of this app.
#: Defaults to :class:`~flask.Config`.
#:
#: Example use cases for a custom class:
#:
#: 1. Default values for certain config options.
#: 2. Access to config values through attributes in addition to keys.
#:
#: .. versionadded:: 0.11
config_class
=
Config
#: The testing flag. Set this to ``True`` to enable the test mode of
#: Flask extensions (and in the future probably also Flask itself).
#: For example this might activate test helpers that have an
#: additional runtime cost which should not be enabled by default.
#:
#: If this is enabled and PROPAGATE_EXCEPTIONS is not changed from the
#: default it's implicitly enabled.
#:
#: This attribute can also be configured from the config with the
#: ``TESTING`` configuration key. Defaults to ``False``.
testing
=
ConfigAttribute
[
bool
](
"
TESTING
"
)
#: If a secret key is set, cryptographic components can use this to
#: sign cookies and other things. Set this to a complex random value
#: when you want to use the secure cookie for instance.
#:
#: This attribute can also be configured from the config with the
#: :data:`SECRET_KEY` configuration key. Defaults to ``None``.
secret_key
=
ConfigAttribute
[
t
.
Union
[
str
,
bytes
,
None
]](
"
SECRET_KEY
"
)
#: A :class:`~datetime.timedelta` which is used to set the expiration
#: date of a permanent session. The default is 31 days which makes a
#: permanent session survive for roughly one month.
#:
#: This attribute can also be configured from the config with the
#: ``PERMANENT_SESSION_LIFETIME`` configuration key. Defaults to
#: ``timedelta(days=31)``
permanent_session_lifetime
=
ConfigAttribute
[
timedelta
](
"
PERMANENT_SESSION_LIFETIME
"
,
get_converter
=
_make_timedelta
,
# type: ignore[arg-type]
)
json_provider_class
:
type
[
JSONProvider
]
=
DefaultJSONProvider
"""
A subclass of :class:`~flask.json.provider.JSONProvider`. An
instance is created and assigned to :attr:`app.json` when creating
the app.
The default, :class:`~flask.json.provider.DefaultJSONProvider`, uses
Python
'
s built-in :mod:`json` library. A different provider can use
a different JSON library.
.. versionadded:: 2.2
"""
#: Options that are passed to the Jinja environment in
#: :meth:`create_jinja_environment`. Changing these options after
#: the environment is created (accessing :attr:`jinja_env`) will
#: have no effect.
#:
#: .. versionchanged:: 1.1.0
#: This is a ``dict`` instead of an ``ImmutableDict`` to allow
#: easier configuration.
#:
jinja_options
:
dict
[
str
,
t
.
Any
]
=
{}
#: The rule object to use for URL rules created. This is used by
#: :meth:`add_url_rule`. Defaults to :class:`werkzeug.routing.Rule`.
#:
#: .. versionadded:: 0.7
url_rule_class
=
Rule
#: The map object to use for storing the URL rules and routing
#: configuration parameters. Defaults to :class:`werkzeug.routing.Map`.
#:
#: .. versionadded:: 1.1.0
url_map_class
=
Map
#: The :meth:`test_client` method creates an instance of this test
#: client class. Defaults to :class:`~flask.testing.FlaskClient`.
#:
#: .. versionadded:: 0.7
test_client_class
:
type
[
FlaskClient
]
|
None
=
None
#: The :class:`~click.testing.CliRunner` subclass, by default
#: :class:`~flask.testing.FlaskCliRunner` that is used by
#: :meth:`test_cli_runner`. Its ``__init__`` method should take a
#: Flask app object as the first argument.
#:
#: .. versionadded:: 1.0
test_cli_runner_class
:
type
[
FlaskCliRunner
]
|
None
=
None
default_config
:
dict
[
str
,
t
.
Any
]
response_class
:
type
[
Response
]
def
__init__
(
self
,
import_name
:
str
,
static_url_path
:
str
|
None
=
None
,
static_folder
:
str
|
os
.
PathLike
[
str
]
|
None
=
"
static
"
,
static_host
:
str
|
None
=
None
,
host_matching
:
bool
=
False
,
subdomain_matching
:
bool
=
False
,
template_folder
:
str
|
os
.
PathLike
[
str
]
|
None
=
"
templates
"
,
instance_path
:
str
|
None
=
None
,
instance_relative_config
:
bool
=
False
,
root_path
:
str
|
None
=
None
,
):
super
().
__init__
(
import_name
=
import_name
,
static_folder
=
static_folder
,
static_url_path
=
static_url_path
,
template_folder
=
template_folder
,
root_path
=
root_path
,
)
if
instance_path
is
None
:
instance_path
=
self
.
auto_find_instance_path
()
elif
not
os
.
path
.
isabs
(
instance_path
):
raise
ValueError
(
"
If an instance path is provided it must be absolute.
"
"
A relative path was given instead.
"
)
#: Holds the path to the instance folder.
#:
#: .. versionadded:: 0.8
self
.
instance_path
=
instance_path
#: The configuration dictionary as :class:`Config`. This behaves
#: exactly like a regular dictionary but supports additional methods
#: to load a config from files.
self
.
config
=
self
.
make_config
(
instance_relative_config
)
#: An instance of :attr:`aborter_class` created by
#: :meth:`make_aborter`. This is called by :func:`flask.abort`
#: to raise HTTP errors, and can be called directly as well.
#:
#: .. versionadded:: 2.2
#: Moved from ``flask.abort``, which calls this object.
self
.
aborter
=
self
.
make_aborter
()
self
.
json
:
JSONProvider
=
self
.
json_provider_class
(
self
)
"""
Provides access to JSON methods. Functions in ``flask.json``
will call methods on this provider when the application context
is active. Used for handling JSON requests and responses.
An instance of :attr:`json_provider_class`. Can be customized by
changing that attribute on a subclass, or by assigning to this
attribute afterwards.
The default, :class:`~flask.json.provider.DefaultJSONProvider`,
uses Python
'
s built-in :mod:`json` library. A different provider
can use a different JSON library.
.. versionadded:: 2.2
"""
#: A list of functions that are called by
#: :meth:`handle_url_build_error` when :meth:`.url_for` raises a
#: :exc:`~werkzeug.routing.BuildError`. Each function is called
#: with ``error``, ``endpoint`` and ``values``. If a function
#: returns ``None`` or raises a ``BuildError``, it is skipped.
#: Otherwise, its return value is returned by ``url_for``.
#:
#: .. versionadded:: 0.9
self
.
url_build_error_handlers
:
list
[
t
.
Callable
[[
Exception
,
str
,
dict
[
str
,
t
.
Any
]],
str
]
]
=
[]
#: A list of functions that are called when the application context
#: is destroyed. Since the application context is also torn down
#: if the request ends this is the place to store code that disconnects
#: from databases.
#:
#: .. versionadded:: 0.9
self
.
teardown_appcontext_funcs
:
list
[
ft
.
TeardownCallable
]
=
[]
#: A list of shell context processor functions that should be run
#: when a shell context is created.
#:
#: .. versionadded:: 0.11
self
.
shell_context_processors
:
list
[
ft
.
ShellContextProcessorCallable
]
=
[]
#: Maps registered blueprint names to blueprint objects. The
#: dict retains the order the blueprints were registered in.
#: Blueprints can be registered multiple times, this dict does
#: not track how often they were attached.
#:
#: .. versionadded:: 0.7
self
.
blueprints
:
dict
[
str
,
Blueprint
]
=
{}
#: a place where extensions can store application specific state. For
#: example this is where an extension could store database engines and
#: similar things.
#:
#: The key must match the name of the extension module. For example in
#: case of a "Flask-Foo" extension in `flask_foo`, the key would be
#: ``'foo'``.
#:
#: .. versionadded:: 0.7
self
.
extensions
:
dict
[
str
,
t
.
Any
]
=
{}
#: The :class:`~werkzeug.routing.Map` for this instance. You can use
#: this to change the routing converters after the class was created
#: but before any routes are connected. Example::
#:
#: from werkzeug.routing import BaseConverter
#:
#: class ListConverter(BaseConverter):
#: def to_python(self, value):
#: return value.split(',')
#: def to_url(self, values):
#: return ','.join(super(ListConverter, self).to_url(value)
#: for value in values)
#:
#: app = Flask(__name__)
#: app.url_map.converters['list'] = ListConverter
self
.
url_map
=
self
.
url_map_class
(
host_matching
=
host_matching
)
self
.
subdomain_matching
=
subdomain_matching
# tracks internally if the application already handled at least one
# request.
self
.
_got_first_request
=
False
# Set the name of the Click group in case someone wants to add
# the app's commands to another CLI tool.
self
.
cli
.
name
=
self
.
name
def
_check_setup_finished
(
self
,
f_name
:
str
)
->
None
:
if
self
.
_got_first_request
:
raise
AssertionError
(
f
"
The setup method
'
{
f_name
}
'
can no longer be called
"
"
on the application. It has already handled its first
"
"
request, any changes will not be applied
"
"
consistently.
\n
"
"
Make sure all imports, decorators, functions, etc.
"
"
needed to set up the application are done before
"
"
running it.
"
)
@cached_property
def
name
(
self
)
->
str
:
# type: ignore
"""
The name of the application. This is usually the import name
with the difference that it
'
s guessed from the run file if the
import name is main. This name is used as a display name when
Flask needs the name of the application. It can be set and overridden
to change the value.
.. versionadded:: 0.8
"""
if
self
.
import_name
==
"
__main__
"
:
fn
:
str
|
None
=
getattr
(
sys
.
modules
[
"
__main__
"
],
"
__file__
"
,
None
)
if
fn
is
None
:
return
"
__main__
"
return
os
.
path
.
splitext
(
os
.
path
.
basename
(
fn
))[
0
]
return
self
.
import_name
@cached_property
def
logger
(
self
)
->
logging
.
Logger
:
"""
A standard Python :class:`~logging.Logger` for the app, with
the same name as :attr:`name`.
In debug mode, the logger
'
s :attr:`~logging.Logger.level` will
be set to :data:`~logging.DEBUG`.
If there are no handlers configured, a default handler will be
added. See :doc:`/logging` for more information.
.. versionchanged:: 1.1.0
The logger takes the same name as :attr:`name` rather than
hard-coding ``
"
flask.app
"
``.
.. versionchanged:: 1.0.0
Behavior was simplified. The logger is always named
``
"
flask.app
"
``. The level is only set during configuration,
it doesn
'
t check ``app.debug`` each time. Only one format is
used, not different ones depending on ``app.debug``. No
handlers are removed, and a handler is only added if no
handlers are already configured.
.. versionadded:: 0.3
"""
return
create_logger
(
self
)
@cached_property
def
jinja_env
(
self
)
->
Environment
:
"""
The Jinja environment used to load templates.
The environment is created the first time this property is
accessed. Changing :attr:`jinja_options` after that will have no
effect.
"""
return
self
.
create_jinja_environment
()
def
create_jinja_environment
(
self
)
->
Environment
:
raise
NotImplementedError
()
def
make_config
(
self
,
instance_relative
:
bool
=
False
)
->
Config
:
"""
Used to create the config attribute by the Flask constructor.
The `instance_relative` parameter is passed in from the constructor
of Flask (there named `instance_relative_config`) and indicates if
the config should be relative to the instance path or the root path
of the application.
.. versionadded:: 0.8
"""
root_path
=
self
.
root_path
if
instance_relative
:
root_path
=
self
.
instance_path
defaults
=
dict
(
self
.
default_config
)
defaults
[
"
DEBUG
"
]
=
get_debug_flag
()
return
self
.
config_class
(
root_path
,
defaults
)
def
make_aborter
(
self
)
->
Aborter
:
"""
Create the object to assign to :attr:`aborter`. That object
is called by :func:`flask.abort` to raise HTTP errors, and can
be called directly as well.
By default, this creates an instance of :attr:`aborter_class`,
which defaults to :class:`werkzeug.exceptions.Aborter`.
.. versionadded:: 2.2
"""
return
self
.
aborter_class
()
def
auto_find_instance_path
(
self
)
->
str
:
"""
Tries to locate the instance path if it was not provided to the
constructor of the application class. It will basically calculate
the path to a folder named ``instance`` next to your main file or
the package.
.. versionadded:: 0.8
"""
prefix
,
package_path
=
find_package
(
self
.
import_name
)
if
prefix
is
None
:
return
os
.
path
.
join
(
package_path
,
"
instance
"
)
return
os
.
path
.
join
(
prefix
,
"
var
"
,
f
"
{
self
.
name
}
-instance
"
)
def
create_global_jinja_loader
(
self
)
->
DispatchingJinjaLoader
:
"""
Creates the loader for the Jinja2 environment. Can be used to
override just the loader and keeping the rest unchanged. It
'
s
discouraged to override this function. Instead one should override
the :meth:`jinja_loader` function instead.
The global loader dispatches between the loaders of the application
and the individual blueprints.
.. versionadded:: 0.7
"""
return
DispatchingJinjaLoader
(
self
)
def
select_jinja_autoescape
(
self
,
filename
:
str
)
->
bool
:
"""
Returns ``True`` if autoescaping should be active for the given
template name. If no template name is given, returns `True`.
.. versionchanged:: 2.2
Autoescaping is now enabled by default for ``.svg`` files.
.. versionadded:: 0.5
"""
if
filename
is
None
:
return
True
return
filename
.
endswith
((
"
.html
"
,
"
.htm
"
,
"
.xml
"
,
"
.xhtml
"
,
"
.svg
"
))
@property
def
debug
(
self
)
->
bool
:
"""
Whether debug mode is enabled. When using ``flask run`` to start the
development server, an interactive debugger will be shown for unhandled
exceptions, and the server will be reloaded when code changes. This maps to the
:data:`DEBUG` config key. It may not behave as expected if set late.
**Do not enable debug mode when deploying in production.**
Default: ``False``
"""
return
self
.
config
[
"
DEBUG
"
]
# type: ignore[no-any-return]
@debug.setter
def
debug
(
self
,
value
:
bool
)
->
None
:
self
.
config
[
"
DEBUG
"
]
=
value
if
self
.
config
[
"
TEMPLATES_AUTO_RELOAD
"
]
is
None
:
self
.
jinja_env
.
auto_reload
=
value
@setupmethod
def
register_blueprint
(
self
,
blueprint
:
Blueprint
,
**
options
:
t
.
Any
)
->
None
:
"""
Register a :class:`~flask.Blueprint` on the application. Keyword
arguments passed to this method will override the defaults set on the
blueprint.
Calls the blueprint
'
s :meth:`~flask.Blueprint.register` method after
recording the blueprint in the application
'
s :attr:`blueprints`.
:param blueprint: The blueprint to register.
:param url_prefix: Blueprint routes will be prefixed with this.
:param subdomain: Blueprint routes will match on this subdomain.
:param url_defaults: Blueprint routes will use these default values for
view arguments.
:param options: Additional keyword arguments are passed to
:class:`~flask.blueprints.BlueprintSetupState`. They can be
accessed in :meth:`~flask.Blueprint.record` callbacks.
.. versionchanged:: 2.0.1
The ``name`` option can be used to change the (pre-dotted)
name the blueprint is registered with. This allows the same
blueprint to be registered multiple times with unique names
for ``url_for``.
.. versionadded:: 0.7
"""
blueprint
.
register
(
self
,
options
)
def
iter_blueprints
(
self
)
->
t
.
ValuesView
[
Blueprint
]:
"""
Iterates over all blueprints by the order they were registered.
.. versionadded:: 0.11
"""
return
self
.
blueprints
.
values
()
@setupmethod
def
add_url_rule
(
self
,
rule
:
str
,
endpoint
:
str
|
None
=
None
,
view_func
:
ft
.
RouteCallable
|
None
=
None
,
provide_automatic_options
:
bool
|
None
=
None
,
**
options
:
t
.
Any
,
)
->
None
:
if
endpoint
is
None
:
endpoint
=
_endpoint_from_view_func
(
view_func
)
# type: ignore
options
[
"
endpoint
"
]
=
endpoint
methods
=
options
.
pop
(
"
methods
"
,
None
)
# if the methods are not given and the view_func object knows its
# methods we can use that instead. If neither exists, we go with
# a tuple of only ``GET`` as default.
if
methods
is
None
:
methods
=
getattr
(
view_func
,
"
methods
"
,
None
)
or
(
"
GET
"
,)
if
isinstance
(
methods
,
str
):
raise
TypeError
(
"
Allowed methods must be a list of strings, for
"
'
example: @app.route(..., methods=[
"
POST
"
])
'
)
methods
=
{
item
.
upper
()
for
item
in
methods
}
# Methods that should always be added
required_methods
=
set
(
getattr
(
view_func
,
"
required_methods
"
,
()))
# starting with Flask 0.8 the view_func object can disable and
# force-enable the automatic options handling.
if
provide_automatic_options
is
None
:
provide_automatic_options
=
getattr
(
view_func
,
"
provide_automatic_options
"
,
None
)
if
provide_automatic_options
is
None
:
if
"
OPTIONS
"
not
in
methods
:
provide_automatic_options
=
True
required_methods
.
add
(
"
OPTIONS
"
)
else
:
provide_automatic_options
=
False
# Add the required methods now.
methods
|=
required_methods
rule_obj
=
self
.
url_rule_class
(
rule
,
methods
=
methods
,
**
options
)
rule_obj
.
provide_automatic_options
=
provide_automatic_options
# type: ignore[attr-defined]
self
.
url_map
.
add
(
rule_obj
)
if
view_func
is
not
None
:
old_func
=
self
.
view_functions
.
get
(
endpoint
)
if
old_func
is
not
None
and
old_func
!=
view_func
:
raise
AssertionError
(
"
View function mapping is overwriting an existing
"
f
"
endpoint function:
{
endpoint
}
"
)
self
.
view_functions
[
endpoint
]
=
view_func
@setupmethod
def
template_filter
(
self
,
name
:
str
|
None
=
None
)
->
t
.
Callable
[[
T_template_filter
],
T_template_filter
]:
"""
A decorator that is used to register custom template filter.
You can specify a name for the filter, otherwise the function
name will be used. Example::
@app.template_filter()
def reverse(s):
return s[::-1]
:param name: the optional name of the filter, otherwise the
function name will be used.
"""
def
decorator
(
f
:
T_template_filter
)
->
T_template_filter
:
self
.
add_template_filter
(
f
,
name
=
name
)
return
f
return
decorator
@setupmethod
def
add_template_filter
(
self
,
f
:
ft
.
TemplateFilterCallable
,
name
:
str
|
None
=
None
)
->
None
:
"""
Register a custom template filter. Works exactly like the
:meth:`template_filter` decorator.
:param name: the optional name of the filter, otherwise the
function name will be used.
"""
self
.
jinja_env
.
filters
[
name
or
f
.
__name__
]
=
f
@setupmethod
def
template_test
(
self
,
name
:
str
|
None
=
None
)
->
t
.
Callable
[[
T_template_test
],
T_template_test
]:
"""
A decorator that is used to register custom template test.
You can specify a name for the test, otherwise the function
name will be used. Example::
@app.template_test()
def is_prime(n):
if n == 2:
return True
for i in range(2, int(math.ceil(math.sqrt(n))) + 1):
if n % i == 0:
return False
return True
.. versionadded:: 0.10
:param name: the optional name of the test, otherwise the
function name will be used.
"""
def
decorator
(
f
:
T_template_test
)
->
T_template_test
:
self
.
add_template_test
(
f
,
name
=
name
)
return
f
return
decorator
@setupmethod
def
add_template_test
(
self
,
f
:
ft
.
TemplateTestCallable
,
name
:
str
|
None
=
None
)
->
None
:
"""
Register a custom template test. Works exactly like the
:meth:`template_test` decorator.
.. versionadded:: 0.10
:param name: the optional name of the test, otherwise the
function name will be used.
"""
self
.
jinja_env
.
tests
[
name
or
f
.
__name__
]
=
f
@setupmethod
def
template_global
(
self
,
name
:
str
|
None
=
None
)
->
t
.
Callable
[[
T_template_global
],
T_template_global
]:
"""
A decorator that is used to register a custom template global function.
You can specify a name for the global function, otherwise the function
name will be used. Example::
@app.template_global()
def double(n):
return 2 * n
.. versionadded:: 0.10
:param name: the optional name of the global function, otherwise the
function name will be used.
"""
def
decorator
(
f
:
T_template_global
)
->
T_template_global
:
self
.
add_template_global
(
f
,
name
=
name
)
return
f
return
decorator
@setupmethod
def
add_template_global
(
self
,
f
:
ft
.
TemplateGlobalCallable
,
name
:
str
|
None
=
None
)
->
None
:
"""
Register a custom template global function. Works exactly like the
:meth:`template_global` decorator.
.. versionadded:: 0.10
:param name: the optional name of the global function, otherwise the
function name will be used.
"""
self
.
jinja_env
.
globals
[
name
or
f
.
__name__
]
=
f
@setupmethod
def
teardown_appcontext
(
self
,
f
:
T_teardown
)
->
T_teardown
:
"""
Registers a function to be called when the application
context is popped. The application context is typically popped
after the request context for each request, at the end of CLI
commands, or after a manually pushed context ends.
.. code-block:: python
with app.app_context():
...
When the ``with`` block exits (or ``ctx.pop()`` is called), the
teardown functions are called just before the app context is
made inactive. Since a request context typically also manages an
application context it would also be called when you pop a
request context.
When a teardown function was called because of an unhandled
exception it will be passed an error object. If an
:meth:`errorhandler` is registered, it will handle the exception
and the teardown will not receive it.
Teardown functions must avoid raising exceptions. If they
execute code that might fail they must surround that code with a
``try``/``except`` block and log any errors.
The return values of teardown functions are ignored.
.. versionadded:: 0.9
"""
self
.
teardown_appcontext_funcs
.
append
(
f
)
return
f
@setupmethod
def
shell_context_processor
(
self
,
f
:
T_shell_context_processor
)
->
T_shell_context_processor
:
"""
Registers a shell context processor function.
.. versionadded:: 0.11
"""
self
.
shell_context_processors
.
append
(
f
)
return
f
def
_find_error_handler
(
self
,
e
:
Exception
,
blueprints
:
list
[
str
]
)
->
ft
.
ErrorHandlerCallable
|
None
:
"""
Return a registered error handler for an exception in this order:
blueprint handler for a specific code, app handler for a specific code,
blueprint handler for an exception class, app handler for an exception
class, or ``None`` if a suitable handler is not found.
"""
exc_class
,
code
=
self
.
_get_exc_class_and_code
(
type
(
e
))
names
=
(
*
blueprints
,
None
)
for
c
in
(
code
,
None
)
if
code
is
not
None
else
(
None
,):
for
name
in
names
:
handler_map
=
self
.
error_handler_spec
[
name
][
c
]
if
not
handler_map
:
continue
for
cls
in
exc_class
.
__mro__
:
handler
=
handler_map
.
get
(
cls
)
if
handler
is
not
None
:
return
handler
return
None
def
trap_http_exception
(
self
,
e
:
Exception
)
->
bool
:
"""
Checks if an HTTP exception should be trapped or not. By default
this will return ``False`` for all exceptions except for a bad request
key error if ``TRAP_BAD_REQUEST_ERRORS`` is set to ``True``. It
also returns ``True`` if ``TRAP_HTTP_EXCEPTIONS`` is set to ``True``.
This is called for all HTTP exceptions raised by a view function.
If it returns ``True`` for any exception the error handler for this
exception is not called and it shows up as regular exception in the
traceback. This is helpful for debugging implicitly raised HTTP
exceptions.
.. versionchanged:: 1.0
Bad request errors are not trapped by default in debug mode.
.. versionadded:: 0.8
"""
if
self
.
config
[
"
TRAP_HTTP_EXCEPTIONS
"
]:
return
True
trap_bad_request
=
self
.
config
[
"
TRAP_BAD_REQUEST_ERRORS
"
]
# if unset, trap key errors in debug mode
if
(
trap_bad_request
is
None
and
self
.
debug
and
isinstance
(
e
,
BadRequestKeyError
)
):
return
True
if
trap_bad_request
:
return
isinstance
(
e
,
BadRequest
)
return
False
def
should_ignore_error
(
self
,
error
:
BaseException
|
None
)
->
bool
:
"""
This is called to figure out if an error should be ignored
or not as far as the teardown system is concerned. If this
function returns ``True`` then the teardown handlers will not be
passed the error.
.. versionadded:: 0.10
"""
return
False
def
redirect
(
self
,
location
:
str
,
code
:
int
=
302
)
->
BaseResponse
:
"""
Create a redirect response object.
This is called by :func:`flask.redirect`, and can be called
directly as well.
:param location: The URL to redirect to.
:param code: The status code for the redirect.
.. versionadded:: 2.2
Moved from ``flask.redirect``, which calls this method.
"""
return
_wz_redirect
(
location
,
code
=
code
,
Response
=
self
.
response_class
,
# type: ignore[arg-type]
)
def
inject_url_defaults
(
self
,
endpoint
:
str
,
values
:
dict
[
str
,
t
.
Any
])
->
None
:
"""
Injects the URL defaults for the given endpoint directly into
the values dictionary passed. This is used internally and
automatically called on URL building.
.. versionadded:: 0.7
"""
names
:
t
.
Iterable
[
str
|
None
]
=
(
None
,)
# url_for may be called outside a request context, parse the
# passed endpoint instead of using request.blueprints.
if
"
.
"
in
endpoint
:
names
=
chain
(
names
,
reversed
(
_split_blueprint_path
(
endpoint
.
rpartition
(
"
.
"
)[
0
]))
)
for
name
in
names
:
if
name
in
self
.
url_default_functions
:
for
func
in
self
.
url_default_functions
[
name
]:
func
(
endpoint
,
values
)
def
handle_url_build_error
(
self
,
error
:
BuildError
,
endpoint
:
str
,
values
:
dict
[
str
,
t
.
Any
]
)
->
str
:
"""
Called by :meth:`.url_for` if a
:exc:`~werkzeug.routing.BuildError` was raised. If this returns
a value, it will be returned by ``url_for``, otherwise the error
will be re-raised.
Each function in :attr:`url_build_error_handlers` is called with
``error``, ``endpoint`` and ``values``. If a function returns
``None`` or raises a ``BuildError``, it is skipped. Otherwise,
its return value is returned by ``url_for``.
:param error: The active ``BuildError`` being handled.
:param endpoint: The endpoint being built.
:param values: The keyword arguments passed to ``url_for``.
"""
for
handler
in
self
.
url_build_error_handlers
:
try
:
rv
=
handler
(
error
,
endpoint
,
values
)
except
BuildError
as
e
:
# make error available outside except block
error
=
e
else
:
if
rv
is
not
None
:
return
rv
# Re-raise if called with an active exception, otherwise raise
# the passed in exception.
if
error
is
sys
.
exc_info
()[
1
]:
raise
raise
error
src/main/java/gui_server/server-temp/venv/lib/python3.10/site-packages/flask/sansio/blueprints.py
deleted
100644 → 0
View file @
34e4eb38
from
__future__
import
annotations
import
os
import
typing
as
t
from
collections
import
defaultdict
from
functools
import
update_wrapper
from
..
import
typing
as
ft
from
.scaffold
import
_endpoint_from_view_func
from
.scaffold
import
_sentinel
from
.scaffold
import
Scaffold
from
.scaffold
import
setupmethod
if
t
.
TYPE_CHECKING
:
# pragma: no cover
from
.app
import
App
DeferredSetupFunction
=
t
.
Callable
[[
"
BlueprintSetupState
"
],
None
]
T_after_request
=
t
.
TypeVar
(
"
T_after_request
"
,
bound
=
ft
.
AfterRequestCallable
[
t
.
Any
])
T_before_request
=
t
.
TypeVar
(
"
T_before_request
"
,
bound
=
ft
.
BeforeRequestCallable
)
T_error_handler
=
t
.
TypeVar
(
"
T_error_handler
"
,
bound
=
ft
.
ErrorHandlerCallable
)
T_teardown
=
t
.
TypeVar
(
"
T_teardown
"
,
bound
=
ft
.
TeardownCallable
)
T_template_context_processor
=
t
.
TypeVar
(
"
T_template_context_processor
"
,
bound
=
ft
.
TemplateContextProcessorCallable
)
T_template_filter
=
t
.
TypeVar
(
"
T_template_filter
"
,
bound
=
ft
.
TemplateFilterCallable
)
T_template_global
=
t
.
TypeVar
(
"
T_template_global
"
,
bound
=
ft
.
TemplateGlobalCallable
)
T_template_test
=
t
.
TypeVar
(
"
T_template_test
"
,
bound
=
ft
.
TemplateTestCallable
)
T_url_defaults
=
t
.
TypeVar
(
"
T_url_defaults
"
,
bound
=
ft
.
URLDefaultCallable
)
T_url_value_preprocessor
=
t
.
TypeVar
(
"
T_url_value_preprocessor
"
,
bound
=
ft
.
URLValuePreprocessorCallable
)
class
BlueprintSetupState
:
"""
Temporary holder object for registering a blueprint with the
application. An instance of this class is created by the
:meth:`~flask.Blueprint.make_setup_state` method and later passed
to all register callback functions.
"""
def
__init__
(
self
,
blueprint
:
Blueprint
,
app
:
App
,
options
:
t
.
Any
,
first_registration
:
bool
,
)
->
None
:
#: a reference to the current application
self
.
app
=
app
#: a reference to the blueprint that created this setup state.
self
.
blueprint
=
blueprint
#: a dictionary with all options that were passed to the
#: :meth:`~flask.Flask.register_blueprint` method.
self
.
options
=
options
#: as blueprints can be registered multiple times with the
#: application and not everything wants to be registered
#: multiple times on it, this attribute can be used to figure
#: out if the blueprint was registered in the past already.
self
.
first_registration
=
first_registration
subdomain
=
self
.
options
.
get
(
"
subdomain
"
)
if
subdomain
is
None
:
subdomain
=
self
.
blueprint
.
subdomain
#: The subdomain that the blueprint should be active for, ``None``
#: otherwise.
self
.
subdomain
=
subdomain
url_prefix
=
self
.
options
.
get
(
"
url_prefix
"
)
if
url_prefix
is
None
:
url_prefix
=
self
.
blueprint
.
url_prefix
#: The prefix that should be used for all URLs defined on the
#: blueprint.
self
.
url_prefix
=
url_prefix
self
.
name
=
self
.
options
.
get
(
"
name
"
,
blueprint
.
name
)
self
.
name_prefix
=
self
.
options
.
get
(
"
name_prefix
"
,
""
)
#: A dictionary with URL defaults that is added to each and every
#: URL that was defined with the blueprint.
self
.
url_defaults
=
dict
(
self
.
blueprint
.
url_values_defaults
)
self
.
url_defaults
.
update
(
self
.
options
.
get
(
"
url_defaults
"
,
()))
def
add_url_rule
(
self
,
rule
:
str
,
endpoint
:
str
|
None
=
None
,
view_func
:
ft
.
RouteCallable
|
None
=
None
,
**
options
:
t
.
Any
,
)
->
None
:
"""
A helper method to register a rule (and optionally a view function)
to the application. The endpoint is automatically prefixed with the
blueprint
'
s name.
"""
if
self
.
url_prefix
is
not
None
:
if
rule
:
rule
=
"
/
"
.
join
((
self
.
url_prefix
.
rstrip
(
"
/
"
),
rule
.
lstrip
(
"
/
"
)))
else
:
rule
=
self
.
url_prefix
options
.
setdefault
(
"
subdomain
"
,
self
.
subdomain
)
if
endpoint
is
None
:
endpoint
=
_endpoint_from_view_func
(
view_func
)
# type: ignore
defaults
=
self
.
url_defaults
if
"
defaults
"
in
options
:
defaults
=
dict
(
defaults
,
**
options
.
pop
(
"
defaults
"
))
self
.
app
.
add_url_rule
(
rule
,
f
"
{
self
.
name_prefix
}
.
{
self
.
name
}
.
{
endpoint
}
"
.
lstrip
(
"
.
"
),
view_func
,
defaults
=
defaults
,
**
options
,
)
class
Blueprint
(
Scaffold
):
"""
Represents a blueprint, a collection of routes and other
app-related functions that can be registered on a real application
later.
A blueprint is an object that allows defining application functions
without requiring an application object ahead of time. It uses the
same decorators as :class:`~flask.Flask`, but defers the need for an
application by recording them for later registration.
Decorating a function with a blueprint creates a deferred function
that is called with :class:`~flask.blueprints.BlueprintSetupState`
when the blueprint is registered on an application.
See :doc:`/blueprints` for more information.
:param name: The name of the blueprint. Will be prepended to each
endpoint name.
:param import_name: The name of the blueprint package, usually
``__name__``. This helps locate the ``root_path`` for the
blueprint.
:param static_folder: A folder with static files that should be
served by the blueprint
'
s static route. The path is relative to
the blueprint
'
s root path. Blueprint static files are disabled
by default.
:param static_url_path: The url to serve static files from.
Defaults to ``static_folder``. If the blueprint does not have
a ``url_prefix``, the app
'
s static route will take precedence,
and the blueprint
'
s static files won
'
t be accessible.
:param template_folder: A folder with templates that should be added
to the app
'
s template search path. The path is relative to the
blueprint
'
s root path. Blueprint templates are disabled by
default. Blueprint templates have a lower precedence than those
in the app
'
s templates folder.
:param url_prefix: A path to prepend to all of the blueprint
'
s URLs,
to make them distinct from the rest of the app
'
s routes.
:param subdomain: A subdomain that blueprint routes will match on by
default.
:param url_defaults: A dict of default values that blueprint routes
will receive by default.
:param root_path: By default, the blueprint will automatically set
this based on ``import_name``. In certain situations this
automatic detection can fail, so the path can be specified
manually instead.
.. versionchanged:: 1.1.0
Blueprints have a ``cli`` group to register nested CLI commands.
The ``cli_group`` parameter controls the name of the group under
the ``flask`` command.
.. versionadded:: 0.7
"""
_got_registered_once
=
False
def
__init__
(
self
,
name
:
str
,
import_name
:
str
,
static_folder
:
str
|
os
.
PathLike
[
str
]
|
None
=
None
,
static_url_path
:
str
|
None
=
None
,
template_folder
:
str
|
os
.
PathLike
[
str
]
|
None
=
None
,
url_prefix
:
str
|
None
=
None
,
subdomain
:
str
|
None
=
None
,
url_defaults
:
dict
[
str
,
t
.
Any
]
|
None
=
None
,
root_path
:
str
|
None
=
None
,
cli_group
:
str
|
None
=
_sentinel
,
# type: ignore[assignment]
):
super
().
__init__
(
import_name
=
import_name
,
static_folder
=
static_folder
,
static_url_path
=
static_url_path
,
template_folder
=
template_folder
,
root_path
=
root_path
,
)
if
not
name
:
raise
ValueError
(
"'
name
'
may not be empty.
"
)
if
"
.
"
in
name
:
raise
ValueError
(
"'
name
'
may not contain a dot
'
.
'
character.
"
)
self
.
name
=
name
self
.
url_prefix
=
url_prefix
self
.
subdomain
=
subdomain
self
.
deferred_functions
:
list
[
DeferredSetupFunction
]
=
[]
if
url_defaults
is
None
:
url_defaults
=
{}
self
.
url_values_defaults
=
url_defaults
self
.
cli_group
=
cli_group
self
.
_blueprints
:
list
[
tuple
[
Blueprint
,
dict
[
str
,
t
.
Any
]]]
=
[]
def
_check_setup_finished
(
self
,
f_name
:
str
)
->
None
:
if
self
.
_got_registered_once
:
raise
AssertionError
(
f
"
The setup method
'
{
f_name
}
'
can no longer be called on the blueprint
"
f
"
'
{
self
.
name
}
'
. It has already been registered at least once, any
"
"
changes will not be applied consistently.
\n
"
"
Make sure all imports, decorators, functions, etc. needed to set up
"
"
the blueprint are done before registering it.
"
)
@setupmethod
def
record
(
self
,
func
:
DeferredSetupFunction
)
->
None
:
"""
Registers a function that is called when the blueprint is
registered on the application. This function is called with the
state as argument as returned by the :meth:`make_setup_state`
method.
"""
self
.
deferred_functions
.
append
(
func
)
@setupmethod
def
record_once
(
self
,
func
:
DeferredSetupFunction
)
->
None
:
"""
Works like :meth:`record` but wraps the function in another
function that will ensure the function is only called once. If the
blueprint is registered a second time on the application, the
function passed is not called.
"""
def
wrapper
(
state
:
BlueprintSetupState
)
->
None
:
if
state
.
first_registration
:
func
(
state
)
self
.
record
(
update_wrapper
(
wrapper
,
func
))
def
make_setup_state
(
self
,
app
:
App
,
options
:
dict
[
str
,
t
.
Any
],
first_registration
:
bool
=
False
)
->
BlueprintSetupState
:
"""
Creates an instance of :meth:`~flask.blueprints.BlueprintSetupState`
object that is later passed to the register callback functions.
Subclasses can override this to return a subclass of the setup state.
"""
return
BlueprintSetupState
(
self
,
app
,
options
,
first_registration
)
@setupmethod
def
register_blueprint
(
self
,
blueprint
:
Blueprint
,
**
options
:
t
.
Any
)
->
None
:
"""
Register a :class:`~flask.Blueprint` on this blueprint. Keyword
arguments passed to this method will override the defaults set
on the blueprint.
.. versionchanged:: 2.0.1
The ``name`` option can be used to change the (pre-dotted)
name the blueprint is registered with. This allows the same
blueprint to be registered multiple times with unique names
for ``url_for``.
.. versionadded:: 2.0
"""
if
blueprint
is
self
:
raise
ValueError
(
"
Cannot register a blueprint on itself
"
)
self
.
_blueprints
.
append
((
blueprint
,
options
))
def
register
(
self
,
app
:
App
,
options
:
dict
[
str
,
t
.
Any
])
->
None
:
"""
Called by :meth:`Flask.register_blueprint` to register all
views and callbacks registered on the blueprint with the
application. Creates a :class:`.BlueprintSetupState` and calls
each :meth:`record` callback with it.
:param app: The application this blueprint is being registered
with.
:param options: Keyword arguments forwarded from
:meth:`~Flask.register_blueprint`.
.. versionchanged:: 2.3
Nested blueprints now correctly apply subdomains.
.. versionchanged:: 2.1
Registering the same blueprint with the same name multiple
times is an error.
.. versionchanged:: 2.0.1
Nested blueprints are registered with their dotted name.
This allows different blueprints with the same name to be
nested at different locations.
.. versionchanged:: 2.0.1
The ``name`` option can be used to change the (pre-dotted)
name the blueprint is registered with. This allows the same
blueprint to be registered multiple times with unique names
for ``url_for``.
"""
name_prefix
=
options
.
get
(
"
name_prefix
"
,
""
)
self_name
=
options
.
get
(
"
name
"
,
self
.
name
)
name
=
f
"
{
name_prefix
}
.
{
self_name
}
"
.
lstrip
(
"
.
"
)
if
name
in
app
.
blueprints
:
bp_desc
=
"
this
"
if
app
.
blueprints
[
name
]
is
self
else
"
a different
"
existing_at
=
f
"
'
{
name
}
'"
if
self_name
!=
name
else
""
raise
ValueError
(
f
"
The name
'
{
self_name
}
'
is already registered for
"
f
"
{
bp_desc
}
blueprint
{
existing_at
}
. Use
'
name=
'
to
"
f
"
provide a unique name.
"
)
first_bp_registration
=
not
any
(
bp
is
self
for
bp
in
app
.
blueprints
.
values
())
first_name_registration
=
name
not
in
app
.
blueprints
app
.
blueprints
[
name
]
=
self
self
.
_got_registered_once
=
True
state
=
self
.
make_setup_state
(
app
,
options
,
first_bp_registration
)
if
self
.
has_static_folder
:
state
.
add_url_rule
(
f
"
{
self
.
static_url_path
}
/<path:filename>
"
,
view_func
=
self
.
send_static_file
,
# type: ignore[attr-defined]
endpoint
=
"
static
"
,
)
# Merge blueprint data into parent.
if
first_bp_registration
or
first_name_registration
:
self
.
_merge_blueprint_funcs
(
app
,
name
)
for
deferred
in
self
.
deferred_functions
:
deferred
(
state
)
cli_resolved_group
=
options
.
get
(
"
cli_group
"
,
self
.
cli_group
)
if
self
.
cli
.
commands
:
if
cli_resolved_group
is
None
:
app
.
cli
.
commands
.
update
(
self
.
cli
.
commands
)
elif
cli_resolved_group
is
_sentinel
:
self
.
cli
.
name
=
name
app
.
cli
.
add_command
(
self
.
cli
)
else
:
self
.
cli
.
name
=
cli_resolved_group
app
.
cli
.
add_command
(
self
.
cli
)
for
blueprint
,
bp_options
in
self
.
_blueprints
:
bp_options
=
bp_options
.
copy
()
bp_url_prefix
=
bp_options
.
get
(
"
url_prefix
"
)
bp_subdomain
=
bp_options
.
get
(
"
subdomain
"
)
if
bp_subdomain
is
None
:
bp_subdomain
=
blueprint
.
subdomain
if
state
.
subdomain
is
not
None
and
bp_subdomain
is
not
None
:
bp_options
[
"
subdomain
"
]
=
bp_subdomain
+
"
.
"
+
state
.
subdomain
elif
bp_subdomain
is
not
None
:
bp_options
[
"
subdomain
"
]
=
bp_subdomain
elif
state
.
subdomain
is
not
None
:
bp_options
[
"
subdomain
"
]
=
state
.
subdomain
if
bp_url_prefix
is
None
:
bp_url_prefix
=
blueprint
.
url_prefix
if
state
.
url_prefix
is
not
None
and
bp_url_prefix
is
not
None
:
bp_options
[
"
url_prefix
"
]
=
(
state
.
url_prefix
.
rstrip
(
"
/
"
)
+
"
/
"
+
bp_url_prefix
.
lstrip
(
"
/
"
)
)
elif
bp_url_prefix
is
not
None
:
bp_options
[
"
url_prefix
"
]
=
bp_url_prefix
elif
state
.
url_prefix
is
not
None
:
bp_options
[
"
url_prefix
"
]
=
state
.
url_prefix
bp_options
[
"
name_prefix
"
]
=
name
blueprint
.
register
(
app
,
bp_options
)
def
_merge_blueprint_funcs
(
self
,
app
:
App
,
name
:
str
)
->
None
:
def
extend
(
bp_dict
:
dict
[
ft
.
AppOrBlueprintKey
,
list
[
t
.
Any
]],
parent_dict
:
dict
[
ft
.
AppOrBlueprintKey
,
list
[
t
.
Any
]],
)
->
None
:
for
key
,
values
in
bp_dict
.
items
():
key
=
name
if
key
is
None
else
f
"
{
name
}
.
{
key
}
"
parent_dict
[
key
].
extend
(
values
)
for
key
,
value
in
self
.
error_handler_spec
.
items
():
key
=
name
if
key
is
None
else
f
"
{
name
}
.
{
key
}
"
value
=
defaultdict
(
dict
,
{
code
:
{
exc_class
:
func
for
exc_class
,
func
in
code_values
.
items
()}
for
code
,
code_values
in
value
.
items
()
},
)
app
.
error_handler_spec
[
key
]
=
value
for
endpoint
,
func
in
self
.
view_functions
.
items
():
app
.
view_functions
[
endpoint
]
=
func
extend
(
self
.
before_request_funcs
,
app
.
before_request_funcs
)
extend
(
self
.
after_request_funcs
,
app
.
after_request_funcs
)
extend
(
self
.
teardown_request_funcs
,
app
.
teardown_request_funcs
,
)
extend
(
self
.
url_default_functions
,
app
.
url_default_functions
)
extend
(
self
.
url_value_preprocessors
,
app
.
url_value_preprocessors
)
extend
(
self
.
template_context_processors
,
app
.
template_context_processors
)
@setupmethod
def
add_url_rule
(
self
,
rule
:
str
,
endpoint
:
str
|
None
=
None
,
view_func
:
ft
.
RouteCallable
|
None
=
None
,
provide_automatic_options
:
bool
|
None
=
None
,
**
options
:
t
.
Any
,
)
->
None
:
"""
Register a URL rule with the blueprint. See :meth:`.Flask.add_url_rule` for
full documentation.
The URL rule is prefixed with the blueprint
'
s URL prefix. The endpoint name,
used with :func:`url_for`, is prefixed with the blueprint
'
s name.
"""
if
endpoint
and
"
.
"
in
endpoint
:
raise
ValueError
(
"'
endpoint
'
may not contain a dot
'
.
'
character.
"
)
if
view_func
and
hasattr
(
view_func
,
"
__name__
"
)
and
"
.
"
in
view_func
.
__name__
:
raise
ValueError
(
"'
view_func
'
name may not contain a dot
'
.
'
character.
"
)
self
.
record
(
lambda
s
:
s
.
add_url_rule
(
rule
,
endpoint
,
view_func
,
provide_automatic_options
=
provide_automatic_options
,
**
options
,
)
)
@setupmethod
def
app_template_filter
(
self
,
name
:
str
|
None
=
None
)
->
t
.
Callable
[[
T_template_filter
],
T_template_filter
]:
"""
Register a template filter, available in any template rendered by the
application. Equivalent to :meth:`.Flask.template_filter`.
:param name: the optional name of the filter, otherwise the
function name will be used.
"""
def
decorator
(
f
:
T_template_filter
)
->
T_template_filter
:
self
.
add_app_template_filter
(
f
,
name
=
name
)
return
f
return
decorator
@setupmethod
def
add_app_template_filter
(
self
,
f
:
ft
.
TemplateFilterCallable
,
name
:
str
|
None
=
None
)
->
None
:
"""
Register a template filter, available in any template rendered by the
application. Works like the :meth:`app_template_filter` decorator. Equivalent to
:meth:`.Flask.add_template_filter`.
:param name: the optional name of the filter, otherwise the
function name will be used.
"""
def
register_template
(
state
:
BlueprintSetupState
)
->
None
:
state
.
app
.
jinja_env
.
filters
[
name
or
f
.
__name__
]
=
f
self
.
record_once
(
register_template
)
@setupmethod
def
app_template_test
(
self
,
name
:
str
|
None
=
None
)
->
t
.
Callable
[[
T_template_test
],
T_template_test
]:
"""
Register a template test, available in any template rendered by the
application. Equivalent to :meth:`.Flask.template_test`.
.. versionadded:: 0.10
:param name: the optional name of the test, otherwise the
function name will be used.
"""
def
decorator
(
f
:
T_template_test
)
->
T_template_test
:
self
.
add_app_template_test
(
f
,
name
=
name
)
return
f
return
decorator
@setupmethod
def
add_app_template_test
(
self
,
f
:
ft
.
TemplateTestCallable
,
name
:
str
|
None
=
None
)
->
None
:
"""
Register a template test, available in any template rendered by the
application. Works like the :meth:`app_template_test` decorator. Equivalent to
:meth:`.Flask.add_template_test`.
.. versionadded:: 0.10
:param name: the optional name of the test, otherwise the
function name will be used.
"""
def
register_template
(
state
:
BlueprintSetupState
)
->
None
:
state
.
app
.
jinja_env
.
tests
[
name
or
f
.
__name__
]
=
f
self
.
record_once
(
register_template
)
@setupmethod
def
app_template_global
(
self
,
name
:
str
|
None
=
None
)
->
t
.
Callable
[[
T_template_global
],
T_template_global
]:
"""
Register a template global, available in any template rendered by the
application. Equivalent to :meth:`.Flask.template_global`.
.. versionadded:: 0.10
:param name: the optional name of the global, otherwise the
function name will be used.
"""
def
decorator
(
f
:
T_template_global
)
->
T_template_global
:
self
.
add_app_template_global
(
f
,
name
=
name
)
return
f
return
decorator
@setupmethod
def
add_app_template_global
(
self
,
f
:
ft
.
TemplateGlobalCallable
,
name
:
str
|
None
=
None
)
->
None
:
"""
Register a template global, available in any template rendered by the
application. Works like the :meth:`app_template_global` decorator. Equivalent to
:meth:`.Flask.add_template_global`.
.. versionadded:: 0.10
:param name: the optional name of the global, otherwise the
function name will be used.
"""
def
register_template
(
state
:
BlueprintSetupState
)
->
None
:
state
.
app
.
jinja_env
.
globals
[
name
or
f
.
__name__
]
=
f
self
.
record_once
(
register_template
)
@setupmethod
def
before_app_request
(
self
,
f
:
T_before_request
)
->
T_before_request
:
"""
Like :meth:`before_request`, but before every request, not only those handled
by the blueprint. Equivalent to :meth:`.Flask.before_request`.
"""
self
.
record_once
(
lambda
s
:
s
.
app
.
before_request_funcs
.
setdefault
(
None
,
[]).
append
(
f
)
)
return
f
@setupmethod
def
after_app_request
(
self
,
f
:
T_after_request
)
->
T_after_request
:
"""
Like :meth:`after_request`, but after every request, not only those handled
by the blueprint. Equivalent to :meth:`.Flask.after_request`.
"""
self
.
record_once
(
lambda
s
:
s
.
app
.
after_request_funcs
.
setdefault
(
None
,
[]).
append
(
f
)
)
return
f
@setupmethod
def
teardown_app_request
(
self
,
f
:
T_teardown
)
->
T_teardown
:
"""
Like :meth:`teardown_request`, but after every request, not only those
handled by the blueprint. Equivalent to :meth:`.Flask.teardown_request`.
"""
self
.
record_once
(
lambda
s
:
s
.
app
.
teardown_request_funcs
.
setdefault
(
None
,
[]).
append
(
f
)
)
return
f
@setupmethod
def
app_context_processor
(
self
,
f
:
T_template_context_processor
)
->
T_template_context_processor
:
"""
Like :meth:`context_processor`, but for templates rendered by every view, not
only by the blueprint. Equivalent to :meth:`.Flask.context_processor`.
"""
self
.
record_once
(
lambda
s
:
s
.
app
.
template_context_processors
.
setdefault
(
None
,
[]).
append
(
f
)
)
return
f
@setupmethod
def
app_errorhandler
(
self
,
code
:
type
[
Exception
]
|
int
)
->
t
.
Callable
[[
T_error_handler
],
T_error_handler
]:
"""
Like :meth:`errorhandler`, but for every request, not only those handled by
the blueprint. Equivalent to :meth:`.Flask.errorhandler`.
"""
def
decorator
(
f
:
T_error_handler
)
->
T_error_handler
:
def
from_blueprint
(
state
:
BlueprintSetupState
)
->
None
:
state
.
app
.
errorhandler
(
code
)(
f
)
self
.
record_once
(
from_blueprint
)
return
f
return
decorator
@setupmethod
def
app_url_value_preprocessor
(
self
,
f
:
T_url_value_preprocessor
)
->
T_url_value_preprocessor
:
"""
Like :meth:`url_value_preprocessor`, but for every request, not only those
handled by the blueprint. Equivalent to :meth:`.Flask.url_value_preprocessor`.
"""
self
.
record_once
(
lambda
s
:
s
.
app
.
url_value_preprocessors
.
setdefault
(
None
,
[]).
append
(
f
)
)
return
f
@setupmethod
def
app_url_defaults
(
self
,
f
:
T_url_defaults
)
->
T_url_defaults
:
"""
Like :meth:`url_defaults`, but for every request, not only those handled by
the blueprint. Equivalent to :meth:`.Flask.url_defaults`.
"""
self
.
record_once
(
lambda
s
:
s
.
app
.
url_default_functions
.
setdefault
(
None
,
[]).
append
(
f
)
)
return
f
src/main/java/gui_server/server-temp/venv/lib/python3.10/site-packages/flask/sansio/scaffold.py
deleted
100644 → 0
View file @
34e4eb38
from
__future__
import
annotations
import
importlib.util
import
os
import
pathlib
import
sys
import
typing
as
t
from
collections
import
defaultdict
from
functools
import
update_wrapper
import
click
from
jinja2
import
BaseLoader
from
jinja2
import
FileSystemLoader
from
werkzeug.exceptions
import
default_exceptions
from
werkzeug.exceptions
import
HTTPException
from
werkzeug.utils
import
cached_property
from
..
import
typing
as
ft
from
..cli
import
AppGroup
from
..helpers
import
get_root_path
from
..templating
import
_default_template_ctx_processor
# a singleton sentinel value for parameter defaults
_sentinel
=
object
()
F
=
t
.
TypeVar
(
"
F
"
,
bound
=
t
.
Callable
[...,
t
.
Any
])
T_after_request
=
t
.
TypeVar
(
"
T_after_request
"
,
bound
=
ft
.
AfterRequestCallable
[
t
.
Any
])
T_before_request
=
t
.
TypeVar
(
"
T_before_request
"
,
bound
=
ft
.
BeforeRequestCallable
)
T_error_handler
=
t
.
TypeVar
(
"
T_error_handler
"
,
bound
=
ft
.
ErrorHandlerCallable
)
T_teardown
=
t
.
TypeVar
(
"
T_teardown
"
,
bound
=
ft
.
TeardownCallable
)
T_template_context_processor
=
t
.
TypeVar
(
"
T_template_context_processor
"
,
bound
=
ft
.
TemplateContextProcessorCallable
)
T_url_defaults
=
t
.
TypeVar
(
"
T_url_defaults
"
,
bound
=
ft
.
URLDefaultCallable
)
T_url_value_preprocessor
=
t
.
TypeVar
(
"
T_url_value_preprocessor
"
,
bound
=
ft
.
URLValuePreprocessorCallable
)
T_route
=
t
.
TypeVar
(
"
T_route
"
,
bound
=
ft
.
RouteCallable
)
def
setupmethod
(
f
:
F
)
->
F
:
f_name
=
f
.
__name__
def
wrapper_func
(
self
:
Scaffold
,
*
args
:
t
.
Any
,
**
kwargs
:
t
.
Any
)
->
t
.
Any
:
self
.
_check_setup_finished
(
f_name
)
return
f
(
self
,
*
args
,
**
kwargs
)
return
t
.
cast
(
F
,
update_wrapper
(
wrapper_func
,
f
))
class
Scaffold
:
"""
Common behavior shared between :class:`~flask.Flask` and
:class:`~flask.blueprints.Blueprint`.
:param import_name: The import name of the module where this object
is defined. Usually :attr:`__name__` should be used.
:param static_folder: Path to a folder of static files to serve.
If this is set, a static route will be added.
:param static_url_path: URL prefix for the static route.
:param template_folder: Path to a folder containing template files.
for rendering. If this is set, a Jinja loader will be added.
:param root_path: The path that static, template, and resource files
are relative to. Typically not set, it is discovered based on
the ``import_name``.
.. versionadded:: 2.0
"""
name
:
str
_static_folder
:
str
|
None
=
None
_static_url_path
:
str
|
None
=
None
def
__init__
(
self
,
import_name
:
str
,
static_folder
:
str
|
os
.
PathLike
[
str
]
|
None
=
None
,
static_url_path
:
str
|
None
=
None
,
template_folder
:
str
|
os
.
PathLike
[
str
]
|
None
=
None
,
root_path
:
str
|
None
=
None
,
):
#: The name of the package or module that this object belongs
#: to. Do not change this once it is set by the constructor.
self
.
import_name
=
import_name
self
.
static_folder
=
static_folder
# type: ignore
self
.
static_url_path
=
static_url_path
#: The path to the templates folder, relative to
#: :attr:`root_path`, to add to the template loader. ``None`` if
#: templates should not be added.
self
.
template_folder
=
template_folder
if
root_path
is
None
:
root_path
=
get_root_path
(
self
.
import_name
)
#: Absolute path to the package on the filesystem. Used to look
#: up resources contained in the package.
self
.
root_path
=
root_path
#: The Click command group for registering CLI commands for this
#: object. The commands are available from the ``flask`` command
#: once the application has been discovered and blueprints have
#: been registered.
self
.
cli
:
click
.
Group
=
AppGroup
()
#: A dictionary mapping endpoint names to view functions.
#:
#: To register a view function, use the :meth:`route` decorator.
#:
#: This data structure is internal. It should not be modified
#: directly and its format may change at any time.
self
.
view_functions
:
dict
[
str
,
ft
.
RouteCallable
]
=
{}
#: A data structure of registered error handlers, in the format
#: ``{scope: {code: {class: handler}}}``. The ``scope`` key is
#: the name of a blueprint the handlers are active for, or
#: ``None`` for all requests. The ``code`` key is the HTTP
#: status code for ``HTTPException``, or ``None`` for
#: other exceptions. The innermost dictionary maps exception
#: classes to handler functions.
#:
#: To register an error handler, use the :meth:`errorhandler`
#: decorator.
#:
#: This data structure is internal. It should not be modified
#: directly and its format may change at any time.
self
.
error_handler_spec
:
dict
[
ft
.
AppOrBlueprintKey
,
dict
[
int
|
None
,
dict
[
type
[
Exception
],
ft
.
ErrorHandlerCallable
]],
]
=
defaultdict
(
lambda
:
defaultdict
(
dict
))
#: A data structure of functions to call at the beginning of
#: each request, in the format ``{scope: [functions]}``. The
#: ``scope`` key is the name of a blueprint the functions are
#: active for, or ``None`` for all requests.
#:
#: To register a function, use the :meth:`before_request`
#: decorator.
#:
#: This data structure is internal. It should not be modified
#: directly and its format may change at any time.
self
.
before_request_funcs
:
dict
[
ft
.
AppOrBlueprintKey
,
list
[
ft
.
BeforeRequestCallable
]
]
=
defaultdict
(
list
)
#: A data structure of functions to call at the end of each
#: request, in the format ``{scope: [functions]}``. The
#: ``scope`` key is the name of a blueprint the functions are
#: active for, or ``None`` for all requests.
#:
#: To register a function, use the :meth:`after_request`
#: decorator.
#:
#: This data structure is internal. It should not be modified
#: directly and its format may change at any time.
self
.
after_request_funcs
:
dict
[
ft
.
AppOrBlueprintKey
,
list
[
ft
.
AfterRequestCallable
[
t
.
Any
]]
]
=
defaultdict
(
list
)
#: A data structure of functions to call at the end of each
#: request even if an exception is raised, in the format
#: ``{scope: [functions]}``. The ``scope`` key is the name of a
#: blueprint the functions are active for, or ``None`` for all
#: requests.
#:
#: To register a function, use the :meth:`teardown_request`
#: decorator.
#:
#: This data structure is internal. It should not be modified
#: directly and its format may change at any time.
self
.
teardown_request_funcs
:
dict
[
ft
.
AppOrBlueprintKey
,
list
[
ft
.
TeardownCallable
]
]
=
defaultdict
(
list
)
#: A data structure of functions to call to pass extra context
#: values when rendering templates, in the format
#: ``{scope: [functions]}``. The ``scope`` key is the name of a
#: blueprint the functions are active for, or ``None`` for all
#: requests.
#:
#: To register a function, use the :meth:`context_processor`
#: decorator.
#:
#: This data structure is internal. It should not be modified
#: directly and its format may change at any time.
self
.
template_context_processors
:
dict
[
ft
.
AppOrBlueprintKey
,
list
[
ft
.
TemplateContextProcessorCallable
]
]
=
defaultdict
(
list
,
{
None
:
[
_default_template_ctx_processor
]})
#: A data structure of functions to call to modify the keyword
#: arguments passed to the view function, in the format
#: ``{scope: [functions]}``. The ``scope`` key is the name of a
#: blueprint the functions are active for, or ``None`` for all
#: requests.
#:
#: To register a function, use the
#: :meth:`url_value_preprocessor` decorator.
#:
#: This data structure is internal. It should not be modified
#: directly and its format may change at any time.
self
.
url_value_preprocessors
:
dict
[
ft
.
AppOrBlueprintKey
,
list
[
ft
.
URLValuePreprocessorCallable
],
]
=
defaultdict
(
list
)
#: A data structure of functions to call to modify the keyword
#: arguments when generating URLs, in the format
#: ``{scope: [functions]}``. The ``scope`` key is the name of a
#: blueprint the functions are active for, or ``None`` for all
#: requests.
#:
#: To register a function, use the :meth:`url_defaults`
#: decorator.
#:
#: This data structure is internal. It should not be modified
#: directly and its format may change at any time.
self
.
url_default_functions
:
dict
[
ft
.
AppOrBlueprintKey
,
list
[
ft
.
URLDefaultCallable
]
]
=
defaultdict
(
list
)
def
__repr__
(
self
)
->
str
:
return
f
"
<
{
type
(
self
).
__name__
}
{
self
.
name
!r}
>
"
def
_check_setup_finished
(
self
,
f_name
:
str
)
->
None
:
raise
NotImplementedError
@property
def
static_folder
(
self
)
->
str
|
None
:
"""
The absolute path to the configured static folder. ``None``
if no static folder is set.
"""
if
self
.
_static_folder
is
not
None
:
return
os
.
path
.
join
(
self
.
root_path
,
self
.
_static_folder
)
else
:
return
None
@static_folder.setter
def
static_folder
(
self
,
value
:
str
|
os
.
PathLike
[
str
]
|
None
)
->
None
:
if
value
is
not
None
:
value
=
os
.
fspath
(
value
).
rstrip
(
r
"
\/
"
)
self
.
_static_folder
=
value
@property
def
has_static_folder
(
self
)
->
bool
:
"""
``True`` if :attr:`static_folder` is set.
.. versionadded:: 0.5
"""
return
self
.
static_folder
is
not
None
@property
def
static_url_path
(
self
)
->
str
|
None
:
"""
The URL prefix that the static route will be accessible from.
If it was not configured during init, it is derived from
:attr:`static_folder`.
"""
if
self
.
_static_url_path
is
not
None
:
return
self
.
_static_url_path
if
self
.
static_folder
is
not
None
:
basename
=
os
.
path
.
basename
(
self
.
static_folder
)
return
f
"
/
{
basename
}
"
.
rstrip
(
"
/
"
)
return
None
@static_url_path.setter
def
static_url_path
(
self
,
value
:
str
|
None
)
->
None
:
if
value
is
not
None
:
value
=
value
.
rstrip
(
"
/
"
)
self
.
_static_url_path
=
value
@cached_property
def
jinja_loader
(
self
)
->
BaseLoader
|
None
:
"""
The Jinja loader for this object
'
s templates. By default this
is a class :class:`jinja2.loaders.FileSystemLoader` to
:attr:`template_folder` if it is set.
.. versionadded:: 0.5
"""
if
self
.
template_folder
is
not
None
:
return
FileSystemLoader
(
os
.
path
.
join
(
self
.
root_path
,
self
.
template_folder
))
else
:
return
None
def
_method_route
(
self
,
method
:
str
,
rule
:
str
,
options
:
dict
[
str
,
t
.
Any
],
)
->
t
.
Callable
[[
T_route
],
T_route
]:
if
"
methods
"
in
options
:
raise
TypeError
(
"
Use the
'
route
'
decorator to use the
'
methods
'
argument.
"
)
return
self
.
route
(
rule
,
methods
=
[
method
],
**
options
)
@setupmethod
def
get
(
self
,
rule
:
str
,
**
options
:
t
.
Any
)
->
t
.
Callable
[[
T_route
],
T_route
]:
"""
Shortcut for :meth:`route` with ``methods=[
"
GET
"
]``.
.. versionadded:: 2.0
"""
return
self
.
_method_route
(
"
GET
"
,
rule
,
options
)
@setupmethod
def
post
(
self
,
rule
:
str
,
**
options
:
t
.
Any
)
->
t
.
Callable
[[
T_route
],
T_route
]:
"""
Shortcut for :meth:`route` with ``methods=[
"
POST
"
]``.
.. versionadded:: 2.0
"""
return
self
.
_method_route
(
"
POST
"
,
rule
,
options
)
@setupmethod
def
put
(
self
,
rule
:
str
,
**
options
:
t
.
Any
)
->
t
.
Callable
[[
T_route
],
T_route
]:
"""
Shortcut for :meth:`route` with ``methods=[
"
PUT
"
]``.
.. versionadded:: 2.0
"""
return
self
.
_method_route
(
"
PUT
"
,
rule
,
options
)
@setupmethod
def
delete
(
self
,
rule
:
str
,
**
options
:
t
.
Any
)
->
t
.
Callable
[[
T_route
],
T_route
]:
"""
Shortcut for :meth:`route` with ``methods=[
"
DELETE
"
]``.
.. versionadded:: 2.0
"""
return
self
.
_method_route
(
"
DELETE
"
,
rule
,
options
)
@setupmethod
def
patch
(
self
,
rule
:
str
,
**
options
:
t
.
Any
)
->
t
.
Callable
[[
T_route
],
T_route
]:
"""
Shortcut for :meth:`route` with ``methods=[
"
PATCH
"
]``.
.. versionadded:: 2.0
"""
return
self
.
_method_route
(
"
PATCH
"
,
rule
,
options
)
@setupmethod
def
route
(
self
,
rule
:
str
,
**
options
:
t
.
Any
)
->
t
.
Callable
[[
T_route
],
T_route
]:
"""
Decorate a view function to register it with the given URL
rule and options. Calls :meth:`add_url_rule`, which has more
details about the implementation.
.. code-block:: python
@app.route(
"
/
"
)
def index():
return
"
Hello, World!
"
See :ref:`url-route-registrations`.
The endpoint name for the route defaults to the name of the view
function if the ``endpoint`` parameter isn
'
t passed.
The ``methods`` parameter defaults to ``[
"
GET
"
]``. ``HEAD`` and
``OPTIONS`` are added automatically.
:param rule: The URL rule string.
:param options: Extra options passed to the
:class:`~werkzeug.routing.Rule` object.
"""
def
decorator
(
f
:
T_route
)
->
T_route
:
endpoint
=
options
.
pop
(
"
endpoint
"
,
None
)
self
.
add_url_rule
(
rule
,
endpoint
,
f
,
**
options
)
return
f
return
decorator
@setupmethod
def
add_url_rule
(
self
,
rule
:
str
,
endpoint
:
str
|
None
=
None
,
view_func
:
ft
.
RouteCallable
|
None
=
None
,
provide_automatic_options
:
bool
|
None
=
None
,
**
options
:
t
.
Any
,
)
->
None
:
"""
Register a rule for routing incoming requests and building
URLs. The :meth:`route` decorator is a shortcut to call this
with the ``view_func`` argument. These are equivalent:
.. code-block:: python
@app.route(
"
/
"
)
def index():
...
.. code-block:: python
def index():
...
app.add_url_rule(
"
/
"
, view_func=index)
See :ref:`url-route-registrations`.
The endpoint name for the route defaults to the name of the view
function if the ``endpoint`` parameter isn
'
t passed. An error
will be raised if a function has already been registered for the
endpoint.
The ``methods`` parameter defaults to ``[
"
GET
"
]``. ``HEAD`` is
always added automatically, and ``OPTIONS`` is added
automatically by default.
``view_func`` does not necessarily need to be passed, but if the
rule should participate in routing an endpoint name must be
associated with a view function at some point with the
:meth:`endpoint` decorator.
.. code-block:: python
app.add_url_rule(
"
/
"
, endpoint=
"
index
"
)
@app.endpoint(
"
index
"
)
def index():
...
If ``view_func`` has a ``required_methods`` attribute, those
methods are added to the passed and automatic methods. If it
has a ``provide_automatic_methods`` attribute, it is used as the
default if the parameter is not passed.
:param rule: The URL rule string.
:param endpoint: The endpoint name to associate with the rule
and view function. Used when routing and building URLs.
Defaults to ``view_func.__name__``.
:param view_func: The view function to associate with the
endpoint name.
:param provide_automatic_options: Add the ``OPTIONS`` method and
respond to ``OPTIONS`` requests automatically.
:param options: Extra options passed to the
:class:`~werkzeug.routing.Rule` object.
"""
raise
NotImplementedError
@setupmethod
def
endpoint
(
self
,
endpoint
:
str
)
->
t
.
Callable
[[
F
],
F
]:
"""
Decorate a view function to register it for the given
endpoint. Used if a rule is added without a ``view_func`` with
:meth:`add_url_rule`.
.. code-block:: python
app.add_url_rule(
"
/ex
"
, endpoint=
"
example
"
)
@app.endpoint(
"
example
"
)
def example():
...
:param endpoint: The endpoint name to associate with the view
function.
"""
def
decorator
(
f
:
F
)
->
F
:
self
.
view_functions
[
endpoint
]
=
f
return
f
return
decorator
@setupmethod
def
before_request
(
self
,
f
:
T_before_request
)
->
T_before_request
:
"""
Register a function to run before each request.
For example, this can be used to open a database connection, or
to load the logged in user from the session.
.. code-block:: python
@app.before_request
def load_user():
if
"
user_id
"
in session:
g.user = db.session.get(session[
"
user_id
"
])
The function will be called without any arguments. If it returns
a non-``None`` value, the value is handled as if it was the
return value from the view, and further request handling is
stopped.
This is available on both app and blueprint objects. When used on an app, this
executes before every request. When used on a blueprint, this executes before
every request that the blueprint handles. To register with a blueprint and
execute before every request, use :meth:`.Blueprint.before_app_request`.
"""
self
.
before_request_funcs
.
setdefault
(
None
,
[]).
append
(
f
)
return
f
@setupmethod
def
after_request
(
self
,
f
:
T_after_request
)
->
T_after_request
:
"""
Register a function to run after each request to this object.
The function is called with the response object, and must return
a response object. This allows the functions to modify or
replace the response before it is sent.
If a function raises an exception, any remaining
``after_request`` functions will not be called. Therefore, this
should not be used for actions that must execute, such as to
close resources. Use :meth:`teardown_request` for that.
This is available on both app and blueprint objects. When used on an app, this
executes after every request. When used on a blueprint, this executes after
every request that the blueprint handles. To register with a blueprint and
execute after every request, use :meth:`.Blueprint.after_app_request`.
"""
self
.
after_request_funcs
.
setdefault
(
None
,
[]).
append
(
f
)
return
f
@setupmethod
def
teardown_request
(
self
,
f
:
T_teardown
)
->
T_teardown
:
"""
Register a function to be called when the request context is
popped. Typically this happens at the end of each request, but
contexts may be pushed manually as well during testing.
.. code-block:: python
with app.test_request_context():
...
When the ``with`` block exits (or ``ctx.pop()`` is called), the
teardown functions are called just before the request context is
made inactive.
When a teardown function was called because of an unhandled
exception it will be passed an error object. If an
:meth:`errorhandler` is registered, it will handle the exception
and the teardown will not receive it.
Teardown functions must avoid raising exceptions. If they
execute code that might fail they must surround that code with a
``try``/``except`` block and log any errors.
The return values of teardown functions are ignored.
This is available on both app and blueprint objects. When used on an app, this
executes after every request. When used on a blueprint, this executes after
every request that the blueprint handles. To register with a blueprint and
execute after every request, use :meth:`.Blueprint.teardown_app_request`.
"""
self
.
teardown_request_funcs
.
setdefault
(
None
,
[]).
append
(
f
)
return
f
@setupmethod
def
context_processor
(
self
,
f
:
T_template_context_processor
,
)
->
T_template_context_processor
:
"""
Registers a template context processor function. These functions run before
rendering a template. The keys of the returned dict are added as variables
available in the template.
This is available on both app and blueprint objects. When used on an app, this
is called for every rendered template. When used on a blueprint, this is called
for templates rendered from the blueprint
'
s views. To register with a blueprint
and affect every template, use :meth:`.Blueprint.app_context_processor`.
"""
self
.
template_context_processors
[
None
].
append
(
f
)
return
f
@setupmethod
def
url_value_preprocessor
(
self
,
f
:
T_url_value_preprocessor
,
)
->
T_url_value_preprocessor
:
"""
Register a URL value preprocessor function for all view
functions in the application. These functions will be called before the
:meth:`before_request` functions.
The function can modify the values captured from the matched url before
they are passed to the view. For example, this can be used to pop a
common language code value and place it in ``g`` rather than pass it to
every view.
The function is passed the endpoint name and values dict. The return
value is ignored.
This is available on both app and blueprint objects. When used on an app, this
is called for every request. When used on a blueprint, this is called for
requests that the blueprint handles. To register with a blueprint and affect
every request, use :meth:`.Blueprint.app_url_value_preprocessor`.
"""
self
.
url_value_preprocessors
[
None
].
append
(
f
)
return
f
@setupmethod
def
url_defaults
(
self
,
f
:
T_url_defaults
)
->
T_url_defaults
:
"""
Callback function for URL defaults for all view functions of the
application. It
'
s called with the endpoint and values and should
update the values passed in place.
This is available on both app and blueprint objects. When used on an app, this
is called for every request. When used on a blueprint, this is called for
requests that the blueprint handles. To register with a blueprint and affect
every request, use :meth:`.Blueprint.app_url_defaults`.
"""
self
.
url_default_functions
[
None
].
append
(
f
)
return
f
@setupmethod
def
errorhandler
(
self
,
code_or_exception
:
type
[
Exception
]
|
int
)
->
t
.
Callable
[[
T_error_handler
],
T_error_handler
]:
"""
Register a function to handle errors by code or exception class.
A decorator that is used to register a function given an
error code. Example::
@app.errorhandler(404)
def page_not_found(error):
return
'
This page does not exist
'
, 404
You can also register handlers for arbitrary exceptions::
@app.errorhandler(DatabaseError)
def special_exception_handler(error):
return
'
Database connection failed
'
, 500
This is available on both app and blueprint objects. When used on an app, this
can handle errors from every request. When used on a blueprint, this can handle
errors from requests that the blueprint handles. To register with a blueprint
and affect every request, use :meth:`.Blueprint.app_errorhandler`.
.. versionadded:: 0.7
Use :meth:`register_error_handler` instead of modifying
:attr:`error_handler_spec` directly, for application wide error
handlers.
.. versionadded:: 0.7
One can now additionally also register custom exception types
that do not necessarily have to be a subclass of the
:class:`~werkzeug.exceptions.HTTPException` class.
:param code_or_exception: the code as integer for the handler, or
an arbitrary exception
"""
def
decorator
(
f
:
T_error_handler
)
->
T_error_handler
:
self
.
register_error_handler
(
code_or_exception
,
f
)
return
f
return
decorator
@setupmethod
def
register_error_handler
(
self
,
code_or_exception
:
type
[
Exception
]
|
int
,
f
:
ft
.
ErrorHandlerCallable
,
)
->
None
:
"""
Alternative error attach function to the :meth:`errorhandler`
decorator that is more straightforward to use for non decorator
usage.
.. versionadded:: 0.7
"""
exc_class
,
code
=
self
.
_get_exc_class_and_code
(
code_or_exception
)
self
.
error_handler_spec
[
None
][
code
][
exc_class
]
=
f
@staticmethod
def
_get_exc_class_and_code
(
exc_class_or_code
:
type
[
Exception
]
|
int
,
)
->
tuple
[
type
[
Exception
],
int
|
None
]:
"""
Get the exception class being handled. For HTTP status codes
or ``HTTPException`` subclasses, return both the exception and
status code.
:param exc_class_or_code: Any exception class, or an HTTP status
code as an integer.
"""
exc_class
:
type
[
Exception
]
if
isinstance
(
exc_class_or_code
,
int
):
try
:
exc_class
=
default_exceptions
[
exc_class_or_code
]
except
KeyError
:
raise
ValueError
(
f
"'
{
exc_class_or_code
}
'
is not a recognized HTTP
"
"
error code. Use a subclass of HTTPException with
"
"
that code instead.
"
)
from
None
else
:
exc_class
=
exc_class_or_code
if
isinstance
(
exc_class
,
Exception
):
raise
TypeError
(
f
"
{
exc_class
!r}
is an instance, not a class. Handlers
"
"
can only be registered for Exception classes or HTTP
"
"
error codes.
"
)
if
not
issubclass
(
exc_class
,
Exception
):
raise
ValueError
(
f
"'
{
exc_class
.
__name__
}
'
is not a subclass of Exception.
"
"
Handlers can only be registered for Exception classes
"
"
or HTTP error codes.
"
)
if
issubclass
(
exc_class
,
HTTPException
):
return
exc_class
,
exc_class
.
code
else
:
return
exc_class
,
None
def
_endpoint_from_view_func
(
view_func
:
ft
.
RouteCallable
)
->
str
:
"""
Internal helper that returns the default endpoint for a given
function. This always is the function name.
"""
assert
view_func
is
not
None
,
"
expected view func if endpoint is not provided.
"
return
view_func
.
__name__
def
_path_is_relative_to
(
path
:
pathlib
.
PurePath
,
base
:
str
)
->
bool
:
# Path.is_relative_to doesn't exist until Python 3.9
try
:
path
.
relative_to
(
base
)
return
True
except
ValueError
:
return
False
def
_find_package_path
(
import_name
:
str
)
->
str
:
"""
Find the path that contains the package or module.
"""
root_mod_name
,
_
,
_
=
import_name
.
partition
(
"
.
"
)
try
:
root_spec
=
importlib
.
util
.
find_spec
(
root_mod_name
)
if
root_spec
is
None
:
raise
ValueError
(
"
not found
"
)
except
(
ImportError
,
ValueError
):
# ImportError: the machinery told us it does not exist
# ValueError:
# - the module name was invalid
# - the module name is __main__
# - we raised `ValueError` due to `root_spec` being `None`
return
os
.
getcwd
()
if
root_spec
.
submodule_search_locations
:
if
root_spec
.
origin
is
None
or
root_spec
.
origin
==
"
namespace
"
:
# namespace package
package_spec
=
importlib
.
util
.
find_spec
(
import_name
)
if
package_spec
is
not
None
and
package_spec
.
submodule_search_locations
:
# Pick the path in the namespace that contains the submodule.
package_path
=
pathlib
.
Path
(
os
.
path
.
commonpath
(
package_spec
.
submodule_search_locations
)
)
search_location
=
next
(
location
for
location
in
root_spec
.
submodule_search_locations
if
_path_is_relative_to
(
package_path
,
location
)
)
else
:
# Pick the first path.
search_location
=
root_spec
.
submodule_search_locations
[
0
]
return
os
.
path
.
dirname
(
search_location
)
else
:
# package with __init__.py
return
os
.
path
.
dirname
(
os
.
path
.
dirname
(
root_spec
.
origin
))
else
:
# module
return
os
.
path
.
dirname
(
root_spec
.
origin
)
# type: ignore[type-var, return-value]
def
find_package
(
import_name
:
str
)
->
tuple
[
str
|
None
,
str
]:
"""
Find the prefix that a package is installed under, and the path
that it would be imported from.
The prefix is the directory containing the standard directory
hierarchy (lib, bin, etc.). If the package is not installed to the
system (:attr:`sys.prefix`) or a virtualenv (``site-packages``),
``None`` is returned.
The path is the entry in :attr:`sys.path` that contains the package
for import. If the package is not installed, it
'
s assumed that the
package was imported from the current working directory.
"""
package_path
=
_find_package_path
(
import_name
)
py_prefix
=
os
.
path
.
abspath
(
sys
.
prefix
)
# installed to the system
if
_path_is_relative_to
(
pathlib
.
PurePath
(
package_path
),
py_prefix
):
return
py_prefix
,
package_path
site_parent
,
site_folder
=
os
.
path
.
split
(
package_path
)
# installed to a virtualenv
if
site_folder
.
lower
()
==
"
site-packages
"
:
parent
,
folder
=
os
.
path
.
split
(
site_parent
)
# Windows (prefix/lib/site-packages)
if
folder
.
lower
()
==
"
lib
"
:
return
parent
,
package_path
# Unix (prefix/lib/pythonX.Y/site-packages)
if
os
.
path
.
basename
(
parent
).
lower
()
==
"
lib
"
:
return
os
.
path
.
dirname
(
parent
),
package_path
# something else (prefix/site-packages)
return
site_parent
,
package_path
# not installed
return
None
,
package_path
src/main/java/gui_server/server-temp/venv/lib/python3.10/site-packages/flask/sessions.py
deleted
100644 → 0
View file @
34e4eb38
from
__future__
import
annotations
import
hashlib
import
typing
as
t
from
collections.abc
import
MutableMapping
from
datetime
import
datetime
from
datetime
import
timezone
from
itsdangerous
import
BadSignature
from
itsdangerous
import
URLSafeTimedSerializer
from
werkzeug.datastructures
import
CallbackDict
from
.json.tag
import
TaggedJSONSerializer
if
t
.
TYPE_CHECKING
:
# pragma: no cover
import
typing_extensions
as
te
from
.app
import
Flask
from
.wrappers
import
Request
from
.wrappers
import
Response
# TODO generic when Python > 3.8
class
SessionMixin
(
MutableMapping
):
# type: ignore[type-arg]
"""
Expands a basic dictionary with session attributes.
"""
@property
def
permanent
(
self
)
->
bool
:
"""
This reflects the ``
'
_permanent
'
`` key in the dict.
"""
return
self
.
get
(
"
_permanent
"
,
False
)
@permanent.setter
def
permanent
(
self
,
value
:
bool
)
->
None
:
self
[
"
_permanent
"
]
=
bool
(
value
)
#: Some implementations can detect whether a session is newly
#: created, but that is not guaranteed. Use with caution. The mixin
# default is hard-coded ``False``.
new
=
False
#: Some implementations can detect changes to the session and set
#: this when that happens. The mixin default is hard coded to
#: ``True``.
modified
=
True
#: Some implementations can detect when session data is read or
#: written and set this when that happens. The mixin default is hard
#: coded to ``True``.
accessed
=
True
# TODO generic when Python > 3.8
class
SecureCookieSession
(
CallbackDict
,
SessionMixin
):
# type: ignore[type-arg]
"""
Base class for sessions based on signed cookies.
This session backend will set the :attr:`modified` and
:attr:`accessed` attributes. It cannot reliably track whether a
session is new (vs. empty), so :attr:`new` remains hard coded to
``False``.
"""
#: When data is changed, this is set to ``True``. Only the session
#: dictionary itself is tracked; if the session contains mutable
#: data (for example a nested dict) then this must be set to
#: ``True`` manually when modifying that data. The session cookie
#: will only be written to the response if this is ``True``.
modified
=
False
#: When data is read or written, this is set to ``True``. Used by
# :class:`.SecureCookieSessionInterface` to add a ``Vary: Cookie``
#: header, which allows caching proxies to cache different pages for
#: different users.
accessed
=
False
def
__init__
(
self
,
initial
:
t
.
Any
=
None
)
->
None
:
def
on_update
(
self
:
te
.
Self
)
->
None
:
self
.
modified
=
True
self
.
accessed
=
True
super
().
__init__
(
initial
,
on_update
)
def
__getitem__
(
self
,
key
:
str
)
->
t
.
Any
:
self
.
accessed
=
True
return
super
().
__getitem__
(
key
)
def
get
(
self
,
key
:
str
,
default
:
t
.
Any
=
None
)
->
t
.
Any
:
self
.
accessed
=
True
return
super
().
get
(
key
,
default
)
def
setdefault
(
self
,
key
:
str
,
default
:
t
.
Any
=
None
)
->
t
.
Any
:
self
.
accessed
=
True
return
super
().
setdefault
(
key
,
default
)
class
NullSession
(
SecureCookieSession
):
"""
Class used to generate nicer error messages if sessions are not
available. Will still allow read-only access to the empty session
but fail on setting.
"""
def
_fail
(
self
,
*
args
:
t
.
Any
,
**
kwargs
:
t
.
Any
)
->
t
.
NoReturn
:
raise
RuntimeError
(
"
The session is unavailable because no secret
"
"
key was set. Set the secret_key on the
"
"
application to something unique and secret.
"
)
__setitem__
=
__delitem__
=
clear
=
pop
=
popitem
=
update
=
setdefault
=
_fail
# type: ignore # noqa: B950
del
_fail
class
SessionInterface
:
"""
The basic interface you have to implement in order to replace the
default session interface which uses werkzeug
'
s securecookie
implementation. The only methods you have to implement are
:meth:`open_session` and :meth:`save_session`, the others have
useful defaults which you don
'
t need to change.
The session object returned by the :meth:`open_session` method has to
provide a dictionary like interface plus the properties and methods
from the :class:`SessionMixin`. We recommend just subclassing a dict
and adding that mixin::
class Session(dict, SessionMixin):
pass
If :meth:`open_session` returns ``None`` Flask will call into
:meth:`make_null_session` to create a session that acts as replacement
if the session support cannot work because some requirement is not
fulfilled. The default :class:`NullSession` class that is created
will complain that the secret key was not set.
To replace the session interface on an application all you have to do
is to assign :attr:`flask.Flask.session_interface`::
app = Flask(__name__)
app.session_interface = MySessionInterface()
Multiple requests with the same session may be sent and handled
concurrently. When implementing a new session interface, consider
whether reads or writes to the backing store must be synchronized.
There is no guarantee on the order in which the session for each
request is opened or saved, it will occur in the order that requests
begin and end processing.
.. versionadded:: 0.8
"""
#: :meth:`make_null_session` will look here for the class that should
#: be created when a null session is requested. Likewise the
#: :meth:`is_null_session` method will perform a typecheck against
#: this type.
null_session_class
=
NullSession
#: A flag that indicates if the session interface is pickle based.
#: This can be used by Flask extensions to make a decision in regards
#: to how to deal with the session object.
#:
#: .. versionadded:: 0.10
pickle_based
=
False
def
make_null_session
(
self
,
app
:
Flask
)
->
NullSession
:
"""
Creates a null session which acts as a replacement object if the
real session support could not be loaded due to a configuration
error. This mainly aids the user experience because the job of the
null session is to still support lookup without complaining but
modifications are answered with a helpful error message of what
failed.
This creates an instance of :attr:`null_session_class` by default.
"""
return
self
.
null_session_class
()
def
is_null_session
(
self
,
obj
:
object
)
->
bool
:
"""
Checks if a given object is a null session. Null sessions are
not asked to be saved.
This checks if the object is an instance of :attr:`null_session_class`
by default.
"""
return
isinstance
(
obj
,
self
.
null_session_class
)
def
get_cookie_name
(
self
,
app
:
Flask
)
->
str
:
"""
The name of the session cookie. Uses``app.config[
"
SESSION_COOKIE_NAME
"
]``.
"""
return
app
.
config
[
"
SESSION_COOKIE_NAME
"
]
# type: ignore[no-any-return]
def
get_cookie_domain
(
self
,
app
:
Flask
)
->
str
|
None
:
"""
The value of the ``Domain`` parameter on the session cookie. If not set,
browsers will only send the cookie to the exact domain it was set from.
Otherwise, they will send it to any subdomain of the given value as well.
Uses the :data:`SESSION_COOKIE_DOMAIN` config.
.. versionchanged:: 2.3
Not set by default, does not fall back to ``SERVER_NAME``.
"""
return
app
.
config
[
"
SESSION_COOKIE_DOMAIN
"
]
# type: ignore[no-any-return]
def
get_cookie_path
(
self
,
app
:
Flask
)
->
str
:
"""
Returns the path for which the cookie should be valid. The
default implementation uses the value from the ``SESSION_COOKIE_PATH``
config var if it
'
s set, and falls back to ``APPLICATION_ROOT`` or
uses ``/`` if it
'
s ``None``.
"""
return
app
.
config
[
"
SESSION_COOKIE_PATH
"
]
or
app
.
config
[
"
APPLICATION_ROOT
"
]
# type: ignore[no-any-return]
def
get_cookie_httponly
(
self
,
app
:
Flask
)
->
bool
:
"""
Returns True if the session cookie should be httponly. This
currently just returns the value of the ``SESSION_COOKIE_HTTPONLY``
config var.
"""
return
app
.
config
[
"
SESSION_COOKIE_HTTPONLY
"
]
# type: ignore[no-any-return]
def
get_cookie_secure
(
self
,
app
:
Flask
)
->
bool
:
"""
Returns True if the cookie should be secure. This currently
just returns the value of the ``SESSION_COOKIE_SECURE`` setting.
"""
return
app
.
config
[
"
SESSION_COOKIE_SECURE
"
]
# type: ignore[no-any-return]
def
get_cookie_samesite
(
self
,
app
:
Flask
)
->
str
|
None
:
"""
Return ``
'
Strict
'
`` or ``
'
Lax
'
`` if the cookie should use the
``SameSite`` attribute. This currently just returns the value of
the :data:`SESSION_COOKIE_SAMESITE` setting.
"""
return
app
.
config
[
"
SESSION_COOKIE_SAMESITE
"
]
# type: ignore[no-any-return]
def
get_expiration_time
(
self
,
app
:
Flask
,
session
:
SessionMixin
)
->
datetime
|
None
:
"""
A helper method that returns an expiration date for the session
or ``None`` if the session is linked to the browser session. The
default implementation returns now + the permanent session
lifetime configured on the application.
"""
if
session
.
permanent
:
return
datetime
.
now
(
timezone
.
utc
)
+
app
.
permanent_session_lifetime
return
None
def
should_set_cookie
(
self
,
app
:
Flask
,
session
:
SessionMixin
)
->
bool
:
"""
Used by session backends to determine if a ``Set-Cookie`` header
should be set for this session cookie for this response. If the session
has been modified, the cookie is set. If the session is permanent and
the ``SESSION_REFRESH_EACH_REQUEST`` config is true, the cookie is
always set.
This check is usually skipped if the session was deleted.
.. versionadded:: 0.11
"""
return
session
.
modified
or
(
session
.
permanent
and
app
.
config
[
"
SESSION_REFRESH_EACH_REQUEST
"
]
)
def
open_session
(
self
,
app
:
Flask
,
request
:
Request
)
->
SessionMixin
|
None
:
"""
This is called at the beginning of each request, after
pushing the request context, before matching the URL.
This must return an object which implements a dictionary-like
interface as well as the :class:`SessionMixin` interface.
This will return ``None`` to indicate that loading failed in
some way that is not immediately an error. The request
context will fall back to using :meth:`make_null_session`
in this case.
"""
raise
NotImplementedError
()
def
save_session
(
self
,
app
:
Flask
,
session
:
SessionMixin
,
response
:
Response
)
->
None
:
"""
This is called at the end of each request, after generating
a response, before removing the request context. It is skipped
if :meth:`is_null_session` returns ``True``.
"""
raise
NotImplementedError
()
session_json_serializer
=
TaggedJSONSerializer
()
class
SecureCookieSessionInterface
(
SessionInterface
):
"""
The default session interface that stores sessions in signed cookies
through the :mod:`itsdangerous` module.
"""
#: the salt that should be applied on top of the secret key for the
#: signing of cookie based sessions.
salt
=
"
cookie-session
"
#: the hash function to use for the signature. The default is sha1
digest_method
=
staticmethod
(
hashlib
.
sha1
)
#: the name of the itsdangerous supported key derivation. The default
#: is hmac.
key_derivation
=
"
hmac
"
#: A python serializer for the payload. The default is a compact
#: JSON derived serializer with support for some extra Python types
#: such as datetime objects or tuples.
serializer
=
session_json_serializer
session_class
=
SecureCookieSession
def
get_signing_serializer
(
self
,
app
:
Flask
)
->
URLSafeTimedSerializer
|
None
:
if
not
app
.
secret_key
:
return
None
signer_kwargs
=
dict
(
key_derivation
=
self
.
key_derivation
,
digest_method
=
self
.
digest_method
)
return
URLSafeTimedSerializer
(
app
.
secret_key
,
salt
=
self
.
salt
,
serializer
=
self
.
serializer
,
signer_kwargs
=
signer_kwargs
,
)
def
open_session
(
self
,
app
:
Flask
,
request
:
Request
)
->
SecureCookieSession
|
None
:
s
=
self
.
get_signing_serializer
(
app
)
if
s
is
None
:
return
None
val
=
request
.
cookies
.
get
(
self
.
get_cookie_name
(
app
))
if
not
val
:
return
self
.
session_class
()
max_age
=
int
(
app
.
permanent_session_lifetime
.
total_seconds
())
try
:
data
=
s
.
loads
(
val
,
max_age
=
max_age
)
return
self
.
session_class
(
data
)
except
BadSignature
:
return
self
.
session_class
()
def
save_session
(
self
,
app
:
Flask
,
session
:
SessionMixin
,
response
:
Response
)
->
None
:
name
=
self
.
get_cookie_name
(
app
)
domain
=
self
.
get_cookie_domain
(
app
)
path
=
self
.
get_cookie_path
(
app
)
secure
=
self
.
get_cookie_secure
(
app
)
samesite
=
self
.
get_cookie_samesite
(
app
)
httponly
=
self
.
get_cookie_httponly
(
app
)
# Add a "Vary: Cookie" header if the session was accessed at all.
if
session
.
accessed
:
response
.
vary
.
add
(
"
Cookie
"
)
# If the session is modified to be empty, remove the cookie.
# If the session is empty, return without setting the cookie.
if
not
session
:
if
session
.
modified
:
response
.
delete_cookie
(
name
,
domain
=
domain
,
path
=
path
,
secure
=
secure
,
samesite
=
samesite
,
httponly
=
httponly
,
)
response
.
vary
.
add
(
"
Cookie
"
)
return
if
not
self
.
should_set_cookie
(
app
,
session
):
return
expires
=
self
.
get_expiration_time
(
app
,
session
)
val
=
self
.
get_signing_serializer
(
app
).
dumps
(
dict
(
session
))
# type: ignore
response
.
set_cookie
(
name
,
val
,
# type: ignore
expires
=
expires
,
httponly
=
httponly
,
domain
=
domain
,
path
=
path
,
secure
=
secure
,
samesite
=
samesite
,
)
response
.
vary
.
add
(
"
Cookie
"
)
src/main/java/gui_server/server-temp/venv/lib/python3.10/site-packages/flask/signals.py
deleted
100644 → 0
View file @
34e4eb38
from
__future__
import
annotations
from
blinker
import
Namespace
# This namespace is only for signals provided by Flask itself.
_signals
=
Namespace
()
template_rendered
=
_signals
.
signal
(
"
template-rendered
"
)
before_render_template
=
_signals
.
signal
(
"
before-render-template
"
)
request_started
=
_signals
.
signal
(
"
request-started
"
)
request_finished
=
_signals
.
signal
(
"
request-finished
"
)
request_tearing_down
=
_signals
.
signal
(
"
request-tearing-down
"
)
got_request_exception
=
_signals
.
signal
(
"
got-request-exception
"
)
appcontext_tearing_down
=
_signals
.
signal
(
"
appcontext-tearing-down
"
)
appcontext_pushed
=
_signals
.
signal
(
"
appcontext-pushed
"
)
appcontext_popped
=
_signals
.
signal
(
"
appcontext-popped
"
)
message_flashed
=
_signals
.
signal
(
"
message-flashed
"
)
src/main/java/gui_server/server-temp/venv/lib/python3.10/site-packages/flask/templating.py
deleted
100644 → 0
View file @
34e4eb38
from
__future__
import
annotations
import
typing
as
t
from
jinja2
import
BaseLoader
from
jinja2
import
Environment
as
BaseEnvironment
from
jinja2
import
Template
from
jinja2
import
TemplateNotFound
from
.globals
import
_cv_app
from
.globals
import
_cv_request
from
.globals
import
current_app
from
.globals
import
request
from
.helpers
import
stream_with_context
from
.signals
import
before_render_template
from
.signals
import
template_rendered
if
t
.
TYPE_CHECKING
:
# pragma: no cover
from
.app
import
Flask
from
.sansio.app
import
App
from
.sansio.scaffold
import
Scaffold
def
_default_template_ctx_processor
()
->
dict
[
str
,
t
.
Any
]:
"""
Default template context processor. Injects `request`,
`session` and `g`.
"""
appctx
=
_cv_app
.
get
(
None
)
reqctx
=
_cv_request
.
get
(
None
)
rv
:
dict
[
str
,
t
.
Any
]
=
{}
if
appctx
is
not
None
:
rv
[
"
g
"
]
=
appctx
.
g
if
reqctx
is
not
None
:
rv
[
"
request
"
]
=
reqctx
.
request
rv
[
"
session
"
]
=
reqctx
.
session
return
rv
class
Environment
(
BaseEnvironment
):
"""
Works like a regular Jinja2 environment but has some additional
knowledge of how Flask
'
s blueprint works so that it can prepend the
name of the blueprint to referenced templates if necessary.
"""
def
__init__
(
self
,
app
:
App
,
**
options
:
t
.
Any
)
->
None
:
if
"
loader
"
not
in
options
:
options
[
"
loader
"
]
=
app
.
create_global_jinja_loader
()
BaseEnvironment
.
__init__
(
self
,
**
options
)
self
.
app
=
app
class
DispatchingJinjaLoader
(
BaseLoader
):
"""
A loader that looks for templates in the application and all
the blueprint folders.
"""
def
__init__
(
self
,
app
:
App
)
->
None
:
self
.
app
=
app
def
get_source
(
self
,
environment
:
BaseEnvironment
,
template
:
str
)
->
tuple
[
str
,
str
|
None
,
t
.
Callable
[[],
bool
]
|
None
]:
if
self
.
app
.
config
[
"
EXPLAIN_TEMPLATE_LOADING
"
]:
return
self
.
_get_source_explained
(
environment
,
template
)
return
self
.
_get_source_fast
(
environment
,
template
)
def
_get_source_explained
(
self
,
environment
:
BaseEnvironment
,
template
:
str
)
->
tuple
[
str
,
str
|
None
,
t
.
Callable
[[],
bool
]
|
None
]:
attempts
=
[]
rv
:
tuple
[
str
,
str
|
None
,
t
.
Callable
[[],
bool
]
|
None
]
|
None
trv
:
None
|
(
tuple
[
str
,
str
|
None
,
t
.
Callable
[[],
bool
]
|
None
])
=
None
for
srcobj
,
loader
in
self
.
_iter_loaders
(
template
):
try
:
rv
=
loader
.
get_source
(
environment
,
template
)
if
trv
is
None
:
trv
=
rv
except
TemplateNotFound
:
rv
=
None
attempts
.
append
((
loader
,
srcobj
,
rv
))
from
.debughelpers
import
explain_template_loading_attempts
explain_template_loading_attempts
(
self
.
app
,
template
,
attempts
)
if
trv
is
not
None
:
return
trv
raise
TemplateNotFound
(
template
)
def
_get_source_fast
(
self
,
environment
:
BaseEnvironment
,
template
:
str
)
->
tuple
[
str
,
str
|
None
,
t
.
Callable
[[],
bool
]
|
None
]:
for
_srcobj
,
loader
in
self
.
_iter_loaders
(
template
):
try
:
return
loader
.
get_source
(
environment
,
template
)
except
TemplateNotFound
:
continue
raise
TemplateNotFound
(
template
)
def
_iter_loaders
(
self
,
template
:
str
)
->
t
.
Iterator
[
tuple
[
Scaffold
,
BaseLoader
]]:
loader
=
self
.
app
.
jinja_loader
if
loader
is
not
None
:
yield
self
.
app
,
loader
for
blueprint
in
self
.
app
.
iter_blueprints
():
loader
=
blueprint
.
jinja_loader
if
loader
is
not
None
:
yield
blueprint
,
loader
def
list_templates
(
self
)
->
list
[
str
]:
result
=
set
()
loader
=
self
.
app
.
jinja_loader
if
loader
is
not
None
:
result
.
update
(
loader
.
list_templates
())
for
blueprint
in
self
.
app
.
iter_blueprints
():
loader
=
blueprint
.
jinja_loader
if
loader
is
not
None
:
for
template
in
loader
.
list_templates
():
result
.
add
(
template
)
return
list
(
result
)
def
_render
(
app
:
Flask
,
template
:
Template
,
context
:
dict
[
str
,
t
.
Any
])
->
str
:
app
.
update_template_context
(
context
)
before_render_template
.
send
(
app
,
_async_wrapper
=
app
.
ensure_sync
,
template
=
template
,
context
=
context
)
rv
=
template
.
render
(
context
)
template_rendered
.
send
(
app
,
_async_wrapper
=
app
.
ensure_sync
,
template
=
template
,
context
=
context
)
return
rv
def
render_template
(
template_name_or_list
:
str
|
Template
|
list
[
str
|
Template
],
**
context
:
t
.
Any
,
)
->
str
:
"""
Render a template by name with the given context.
:param template_name_or_list: The name of the template to render. If
a list is given, the first name to exist will be rendered.
:param context: The variables to make available in the template.
"""
app
=
current_app
.
_get_current_object
()
# type: ignore[attr-defined]
template
=
app
.
jinja_env
.
get_or_select_template
(
template_name_or_list
)
return
_render
(
app
,
template
,
context
)
def
render_template_string
(
source
:
str
,
**
context
:
t
.
Any
)
->
str
:
"""
Render a template from the given source string with the given
context.
:param source: The source code of the template to render.
:param context: The variables to make available in the template.
"""
app
=
current_app
.
_get_current_object
()
# type: ignore[attr-defined]
template
=
app
.
jinja_env
.
from_string
(
source
)
return
_render
(
app
,
template
,
context
)
def
_stream
(
app
:
Flask
,
template
:
Template
,
context
:
dict
[
str
,
t
.
Any
]
)
->
t
.
Iterator
[
str
]:
app
.
update_template_context
(
context
)
before_render_template
.
send
(
app
,
_async_wrapper
=
app
.
ensure_sync
,
template
=
template
,
context
=
context
)
def
generate
()
->
t
.
Iterator
[
str
]:
yield
from
template
.
generate
(
context
)
template_rendered
.
send
(
app
,
_async_wrapper
=
app
.
ensure_sync
,
template
=
template
,
context
=
context
)
rv
=
generate
()
# If a request context is active, keep it while generating.
if
request
:
rv
=
stream_with_context
(
rv
)
return
rv
def
stream_template
(
template_name_or_list
:
str
|
Template
|
list
[
str
|
Template
],
**
context
:
t
.
Any
,
)
->
t
.
Iterator
[
str
]:
"""
Render a template by name with the given context as a stream.
This returns an iterator of strings, which can be used as a
streaming response from a view.
:param template_name_or_list: The name of the template to render. If
a list is given, the first name to exist will be rendered.
:param context: The variables to make available in the template.
.. versionadded:: 2.2
"""
app
=
current_app
.
_get_current_object
()
# type: ignore[attr-defined]
template
=
app
.
jinja_env
.
get_or_select_template
(
template_name_or_list
)
return
_stream
(
app
,
template
,
context
)
def
stream_template_string
(
source
:
str
,
**
context
:
t
.
Any
)
->
t
.
Iterator
[
str
]:
"""
Render a template from the given source string with the given
context as a stream. This returns an iterator of strings, which can
be used as a streaming response from a view.
:param source: The source code of the template to render.
:param context: The variables to make available in the template.
.. versionadded:: 2.2
"""
app
=
current_app
.
_get_current_object
()
# type: ignore[attr-defined]
template
=
app
.
jinja_env
.
from_string
(
source
)
return
_stream
(
app
,
template
,
context
)
src/main/java/gui_server/server-temp/venv/lib/python3.10/site-packages/flask/testing.py
deleted
100644 → 0
View file @
34e4eb38
from
__future__
import
annotations
import
importlib.metadata
import
typing
as
t
from
contextlib
import
contextmanager
from
contextlib
import
ExitStack
from
copy
import
copy
from
types
import
TracebackType
from
urllib.parse
import
urlsplit
import
werkzeug.test
from
click.testing
import
CliRunner
from
werkzeug.test
import
Client
from
werkzeug.wrappers
import
Request
as
BaseRequest
from
.cli
import
ScriptInfo
from
.sessions
import
SessionMixin
if
t
.
TYPE_CHECKING
:
# pragma: no cover
from
_typeshed.wsgi
import
WSGIEnvironment
from
werkzeug.test
import
TestResponse
from
.app
import
Flask
class
EnvironBuilder
(
werkzeug
.
test
.
EnvironBuilder
):
"""
An :class:`~werkzeug.test.EnvironBuilder`, that takes defaults from the
application.
:param app: The Flask application to configure the environment from.
:param path: URL path being requested.
:param base_url: Base URL where the app is being served, which
``path`` is relative to. If not given, built from
:data:`PREFERRED_URL_SCHEME`, ``subdomain``,
:data:`SERVER_NAME`, and :data:`APPLICATION_ROOT`.
:param subdomain: Subdomain name to append to :data:`SERVER_NAME`.
:param url_scheme: Scheme to use instead of
:data:`PREFERRED_URL_SCHEME`.
:param json: If given, this is serialized as JSON and passed as
``data``. Also defaults ``content_type`` to
``application/json``.
:param args: other positional arguments passed to
:class:`~werkzeug.test.EnvironBuilder`.
:param kwargs: other keyword arguments passed to
:class:`~werkzeug.test.EnvironBuilder`.
"""
def
__init__
(
self
,
app
:
Flask
,
path
:
str
=
"
/
"
,
base_url
:
str
|
None
=
None
,
subdomain
:
str
|
None
=
None
,
url_scheme
:
str
|
None
=
None
,
*
args
:
t
.
Any
,
**
kwargs
:
t
.
Any
,
)
->
None
:
assert
not
(
base_url
or
subdomain
or
url_scheme
)
or
(
base_url
is
not
None
)
!=
bool
(
subdomain
or
url_scheme
),
'
Cannot pass
"
subdomain
"
or
"
url_scheme
"
with
"
base_url
"
.
'
if
base_url
is
None
:
http_host
=
app
.
config
.
get
(
"
SERVER_NAME
"
)
or
"
localhost
"
app_root
=
app
.
config
[
"
APPLICATION_ROOT
"
]
if
subdomain
:
http_host
=
f
"
{
subdomain
}
.
{
http_host
}
"
if
url_scheme
is
None
:
url_scheme
=
app
.
config
[
"
PREFERRED_URL_SCHEME
"
]
url
=
urlsplit
(
path
)
base_url
=
(
f
"
{
url
.
scheme
or
url_scheme
}
://
{
url
.
netloc
or
http_host
}
"
f
"
/
{
app_root
.
lstrip
(
'
/
'
)
}
"
)
path
=
url
.
path
if
url
.
query
:
sep
=
b
"
?
"
if
isinstance
(
url
.
query
,
bytes
)
else
"
?
"
path
+=
sep
+
url
.
query
self
.
app
=
app
super
().
__init__
(
path
,
base_url
,
*
args
,
**
kwargs
)
def
json_dumps
(
self
,
obj
:
t
.
Any
,
**
kwargs
:
t
.
Any
)
->
str
:
# type: ignore
"""
Serialize ``obj`` to a JSON-formatted string.
The serialization will be configured according to the config associated
with this EnvironBuilder
'
s ``app``.
"""
return
self
.
app
.
json
.
dumps
(
obj
,
**
kwargs
)
_werkzeug_version
=
""
def
_get_werkzeug_version
()
->
str
:
global
_werkzeug_version
if
not
_werkzeug_version
:
_werkzeug_version
=
importlib
.
metadata
.
version
(
"
werkzeug
"
)
return
_werkzeug_version
class
FlaskClient
(
Client
):
"""
Works like a regular Werkzeug test client but has knowledge about
Flask
'
s contexts to defer the cleanup of the request context until
the end of a ``with`` block. For general information about how to
use this class refer to :class:`werkzeug.test.Client`.
.. versionchanged:: 0.12
`app.test_client()` includes preset default environment, which can be
set after instantiation of the `app.test_client()` object in
`client.environ_base`.
Basic usage is outlined in the :doc:`/testing` chapter.
"""
application
:
Flask
def
__init__
(
self
,
*
args
:
t
.
Any
,
**
kwargs
:
t
.
Any
)
->
None
:
super
().
__init__
(
*
args
,
**
kwargs
)
self
.
preserve_context
=
False
self
.
_new_contexts
:
list
[
t
.
ContextManager
[
t
.
Any
]]
=
[]
self
.
_context_stack
=
ExitStack
()
self
.
environ_base
=
{
"
REMOTE_ADDR
"
:
"
127.0.0.1
"
,
"
HTTP_USER_AGENT
"
:
f
"
Werkzeug/
{
_get_werkzeug_version
()
}
"
,
}
@contextmanager
def
session_transaction
(
self
,
*
args
:
t
.
Any
,
**
kwargs
:
t
.
Any
)
->
t
.
Iterator
[
SessionMixin
]:
"""
When used in combination with a ``with`` statement this opens a
session transaction. This can be used to modify the session that
the test client uses. Once the ``with`` block is left the session is
stored back.
::
with client.session_transaction() as session:
session[
'
value
'
] = 42
Internally this is implemented by going through a temporary test
request context and since session handling could depend on
request variables this function accepts the same arguments as
:meth:`~flask.Flask.test_request_context` which are directly
passed through.
"""
if
self
.
_cookies
is
None
:
raise
TypeError
(
"
Cookies are disabled. Create a client with
'
use_cookies=True
'
.
"
)
app
=
self
.
application
ctx
=
app
.
test_request_context
(
*
args
,
**
kwargs
)
self
.
_add_cookies_to_wsgi
(
ctx
.
request
.
environ
)
with
ctx
:
sess
=
app
.
session_interface
.
open_session
(
app
,
ctx
.
request
)
if
sess
is
None
:
raise
RuntimeError
(
"
Session backend did not open a session.
"
)
yield
sess
resp
=
app
.
response_class
()
if
app
.
session_interface
.
is_null_session
(
sess
):
return
with
ctx
:
app
.
session_interface
.
save_session
(
app
,
sess
,
resp
)
self
.
_update_cookies_from_response
(
ctx
.
request
.
host
.
partition
(
"
:
"
)[
0
],
ctx
.
request
.
path
,
resp
.
headers
.
getlist
(
"
Set-Cookie
"
),
)
def
_copy_environ
(
self
,
other
:
WSGIEnvironment
)
->
WSGIEnvironment
:
out
=
{
**
self
.
environ_base
,
**
other
}
if
self
.
preserve_context
:
out
[
"
werkzeug.debug.preserve_context
"
]
=
self
.
_new_contexts
.
append
return
out
def
_request_from_builder_args
(
self
,
args
:
tuple
[
t
.
Any
,
...],
kwargs
:
dict
[
str
,
t
.
Any
]
)
->
BaseRequest
:
kwargs
[
"
environ_base
"
]
=
self
.
_copy_environ
(
kwargs
.
get
(
"
environ_base
"
,
{}))
builder
=
EnvironBuilder
(
self
.
application
,
*
args
,
**
kwargs
)
try
:
return
builder
.
get_request
()
finally
:
builder
.
close
()
def
open
(
self
,
*
args
:
t
.
Any
,
buffered
:
bool
=
False
,
follow_redirects
:
bool
=
False
,
**
kwargs
:
t
.
Any
,
)
->
TestResponse
:
if
args
and
isinstance
(
args
[
0
],
(
werkzeug
.
test
.
EnvironBuilder
,
dict
,
BaseRequest
)
):
if
isinstance
(
args
[
0
],
werkzeug
.
test
.
EnvironBuilder
):
builder
=
copy
(
args
[
0
])
builder
.
environ_base
=
self
.
_copy_environ
(
builder
.
environ_base
or
{})
# type: ignore[arg-type]
request
=
builder
.
get_request
()
elif
isinstance
(
args
[
0
],
dict
):
request
=
EnvironBuilder
.
from_environ
(
args
[
0
],
app
=
self
.
application
,
environ_base
=
self
.
_copy_environ
({})
).
get_request
()
else
:
# isinstance(args[0], BaseRequest)
request
=
copy
(
args
[
0
])
request
.
environ
=
self
.
_copy_environ
(
request
.
environ
)
else
:
# request is None
request
=
self
.
_request_from_builder_args
(
args
,
kwargs
)
# Pop any previously preserved contexts. This prevents contexts
# from being preserved across redirects or multiple requests
# within a single block.
self
.
_context_stack
.
close
()
response
=
super
().
open
(
request
,
buffered
=
buffered
,
follow_redirects
=
follow_redirects
,
)
response
.
json_module
=
self
.
application
.
json
# type: ignore[assignment]
# Re-push contexts that were preserved during the request.
while
self
.
_new_contexts
:
cm
=
self
.
_new_contexts
.
pop
()
self
.
_context_stack
.
enter_context
(
cm
)
return
response
def
__enter__
(
self
)
->
FlaskClient
:
if
self
.
preserve_context
:
raise
RuntimeError
(
"
Cannot nest client invocations
"
)
self
.
preserve_context
=
True
return
self
def
__exit__
(
self
,
exc_type
:
type
|
None
,
exc_value
:
BaseException
|
None
,
tb
:
TracebackType
|
None
,
)
->
None
:
self
.
preserve_context
=
False
self
.
_context_stack
.
close
()
class
FlaskCliRunner
(
CliRunner
):
"""
A :class:`~click.testing.CliRunner` for testing a Flask app
'
s
CLI commands. Typically created using
:meth:`~flask.Flask.test_cli_runner`. See :ref:`testing-cli`.
"""
def
__init__
(
self
,
app
:
Flask
,
**
kwargs
:
t
.
Any
)
->
None
:
self
.
app
=
app
super
().
__init__
(
**
kwargs
)
def
invoke
(
# type: ignore
self
,
cli
:
t
.
Any
=
None
,
args
:
t
.
Any
=
None
,
**
kwargs
:
t
.
Any
)
->
t
.
Any
:
"""
Invokes a CLI command in an isolated environment. See
:meth:`CliRunner.invoke <click.testing.CliRunner.invoke>` for
full method documentation. See :ref:`testing-cli` for examples.
If the ``obj`` argument is not given, passes an instance of
:class:`~flask.cli.ScriptInfo` that knows how to load the Flask
app being tested.
:param cli: Command object to invoke. Default is the app
'
s
:attr:`~flask.app.Flask.cli` group.
:param args: List of strings to invoke the command with.
:return: a :class:`~click.testing.Result` object.
"""
if
cli
is
None
:
cli
=
self
.
app
.
cli
if
"
obj
"
not
in
kwargs
:
kwargs
[
"
obj
"
]
=
ScriptInfo
(
create_app
=
lambda
:
self
.
app
)
return
super
().
invoke
(
cli
,
args
,
**
kwargs
)
Prev
1
2
3
4
5
6
7
8
9
10
11
Next