forked from orbit-oss/flask
Merge branch '2.0.x'
This commit is contained in:
commit
edac7e3a56
11 changed files with 122 additions and 65 deletions
|
|
@ -2,7 +2,7 @@ ci:
|
||||||
autoupdate_schedule: monthly
|
autoupdate_schedule: monthly
|
||||||
repos:
|
repos:
|
||||||
- repo: https://github.com/asottile/pyupgrade
|
- repo: https://github.com/asottile/pyupgrade
|
||||||
rev: v2.29.0
|
rev: v2.29.1
|
||||||
hooks:
|
hooks:
|
||||||
- id: pyupgrade
|
- id: pyupgrade
|
||||||
args: ["--py36-plus"]
|
args: ["--py36-plus"]
|
||||||
|
|
@ -14,7 +14,7 @@ repos:
|
||||||
files: "^(?!examples/)"
|
files: "^(?!examples/)"
|
||||||
args: ["--application-directories", "src"]
|
args: ["--application-directories", "src"]
|
||||||
- repo: https://github.com/psf/black
|
- repo: https://github.com/psf/black
|
||||||
rev: 21.10b0
|
rev: 21.12b0
|
||||||
hooks:
|
hooks:
|
||||||
- id: black
|
- id: black
|
||||||
- repo: https://github.com/PyCQA/flake8
|
- repo: https://github.com/PyCQA/flake8
|
||||||
|
|
|
||||||
|
|
@ -103,6 +103,11 @@ replaces the :meth:`Flask.run` method in most cases. ::
|
||||||
is provided for convenience, but is not designed to be particularly secure,
|
is provided for convenience, but is not designed to be particularly secure,
|
||||||
stable, or efficient. See :doc:`/deploying/index` for how to run in production.
|
stable, or efficient. See :doc:`/deploying/index` for how to run in production.
|
||||||
|
|
||||||
|
If another program is already using port 5000, you'll see
|
||||||
|
``OSError: [Errno 98]`` or ``OSError: [WinError 10013]`` when the
|
||||||
|
server tries to start. See :ref:`address-already-in-use` for how to
|
||||||
|
handle that.
|
||||||
|
|
||||||
|
|
||||||
Open a Shell
|
Open a Shell
|
||||||
------------
|
------------
|
||||||
|
|
|
||||||
|
|
@ -83,6 +83,11 @@ deployment options see :doc:`deploying/index`.
|
||||||
Now head over to http://127.0.0.1:5000/, and you should see your hello
|
Now head over to http://127.0.0.1:5000/, and you should see your hello
|
||||||
world greeting.
|
world greeting.
|
||||||
|
|
||||||
|
If another program is already using port 5000, you'll see
|
||||||
|
``OSError: [Errno 98]`` or ``OSError: [WinError 10013]`` when the
|
||||||
|
server tries to start. See :ref:`address-already-in-use` for how to
|
||||||
|
handle that.
|
||||||
|
|
||||||
.. _public-server:
|
.. _public-server:
|
||||||
|
|
||||||
.. admonition:: Externally Visible Server
|
.. admonition:: Externally Visible Server
|
||||||
|
|
|
||||||
|
|
@ -64,6 +64,47 @@ and using the CLI.
|
||||||
above.
|
above.
|
||||||
|
|
||||||
|
|
||||||
|
.. _address-already-in-use:
|
||||||
|
|
||||||
|
Address already in use
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
If another program is already using port 5000, you'll see an ``OSError``
|
||||||
|
when the server tries to start. It may have one of the following
|
||||||
|
messages:
|
||||||
|
|
||||||
|
- ``OSError: [Errno 98] Address already in use``
|
||||||
|
- ``OSError: [WinError 10013] An attempt was made to access a socket
|
||||||
|
in a way forbidden by its access permissions``
|
||||||
|
|
||||||
|
Either identify and stop the other program, or use
|
||||||
|
``flask run --port 5001`` to pick a different port.
|
||||||
|
|
||||||
|
You can use ``netstat`` to identify what process id is using a port,
|
||||||
|
then use other operating system tools stop that process. The following
|
||||||
|
example shows that process id 6847 is using port 5000.
|
||||||
|
|
||||||
|
.. tabs::
|
||||||
|
|
||||||
|
.. group-tab:: Linux/Mac
|
||||||
|
|
||||||
|
.. code-block:: text
|
||||||
|
|
||||||
|
$ netstat -nlp | grep 5000
|
||||||
|
tcp 0 0 127.0.0.1:5000 0.0.0.0:* LISTEN 6847/python
|
||||||
|
|
||||||
|
.. group-tab:: Windows
|
||||||
|
|
||||||
|
.. code-block:: text
|
||||||
|
|
||||||
|
> netstat -ano | findstr 5000
|
||||||
|
TCP 127.0.0.1:5000 0.0.0.0:0 LISTENING 6847
|
||||||
|
|
||||||
|
MacOS Monterey and later automatically starts a service that uses port
|
||||||
|
5000. To disable the service, go to System Preferences, Sharing, and
|
||||||
|
disable "AirPlay Receiver".
|
||||||
|
|
||||||
|
|
||||||
Lazy or Eager Loading
|
Lazy or Eager Loading
|
||||||
~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -177,4 +177,9 @@ Visit http://127.0.0.1:5000/hello in a browser and you should see the
|
||||||
"Hello, World!" message. Congratulations, you're now running your Flask
|
"Hello, World!" message. Congratulations, you're now running your Flask
|
||||||
web application!
|
web application!
|
||||||
|
|
||||||
|
If another program is already using port 5000, you'll see
|
||||||
|
``OSError: [Errno 98]`` or ``OSError: [WinError 10013]`` when the
|
||||||
|
server tries to start. See :ref:`address-already-in-use` for how to
|
||||||
|
handle that.
|
||||||
|
|
||||||
Continue to :doc:`database`.
|
Continue to :doc:`database`.
|
||||||
|
|
|
||||||
|
|
@ -57,29 +57,29 @@ By the end, your project layout will look like this:
|
||||||
|
|
||||||
/home/user/Projects/flask-tutorial
|
/home/user/Projects/flask-tutorial
|
||||||
├── flaskr/
|
├── flaskr/
|
||||||
│ ├── __init__.py
|
│ ├── __init__.py
|
||||||
│ ├── db.py
|
│ ├── db.py
|
||||||
│ ├── schema.sql
|
│ ├── schema.sql
|
||||||
│ ├── auth.py
|
│ ├── auth.py
|
||||||
│ ├── blog.py
|
│ ├── blog.py
|
||||||
│ ├── templates/
|
│ ├── templates/
|
||||||
│ │ ├── base.html
|
│ │ ├── base.html
|
||||||
│ │ ├── auth/
|
│ │ ├── auth/
|
||||||
│ │ │ ├── login.html
|
│ │ │ ├── login.html
|
||||||
│ │ │ └── register.html
|
│ │ │ └── register.html
|
||||||
│ │ └── blog/
|
│ │ └── blog/
|
||||||
│ │ ├── create.html
|
│ │ ├── create.html
|
||||||
│ │ ├── index.html
|
│ │ ├── index.html
|
||||||
│ │ └── update.html
|
│ │ └── update.html
|
||||||
│ └── static/
|
│ └── static/
|
||||||
│ └── style.css
|
│ └── style.css
|
||||||
├── tests/
|
├── tests/
|
||||||
│ ├── conftest.py
|
│ ├── conftest.py
|
||||||
│ ├── data.sql
|
│ ├── data.sql
|
||||||
│ ├── test_factory.py
|
│ ├── test_factory.py
|
||||||
│ ├── test_db.py
|
│ ├── test_db.py
|
||||||
│ ├── test_auth.py
|
│ ├── test_auth.py
|
||||||
│ └── test_blog.py
|
│ └── test_blog.py
|
||||||
├── venv/
|
├── venv/
|
||||||
├── setup.py
|
├── setup.py
|
||||||
└── MANIFEST.in
|
└── MANIFEST.in
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ attrs==21.2.0
|
||||||
# via pytest
|
# via pytest
|
||||||
babel==2.9.1
|
babel==2.9.1
|
||||||
# via sphinx
|
# via sphinx
|
||||||
backports.entry-points-selectable==1.1.0
|
backports.entry-points-selectable==1.1.1
|
||||||
# via virtualenv
|
# via virtualenv
|
||||||
blinker==1.4
|
blinker==1.4
|
||||||
# via -r requirements/tests.in
|
# via -r requirements/tests.in
|
||||||
|
|
@ -22,49 +22,49 @@ cffi==1.15.0
|
||||||
# via cryptography
|
# via cryptography
|
||||||
cfgv==3.3.1
|
cfgv==3.3.1
|
||||||
# via pre-commit
|
# via pre-commit
|
||||||
charset-normalizer==2.0.7
|
charset-normalizer==2.0.9
|
||||||
# via requests
|
# via requests
|
||||||
click==8.0.3
|
click==8.0.3
|
||||||
# via pip-tools
|
# via pip-tools
|
||||||
cryptography==35.0.0
|
cryptography==36.0.1
|
||||||
# via -r requirements/typing.in
|
# via -r requirements/typing.in
|
||||||
distlib==0.3.3
|
distlib==0.3.4
|
||||||
# via virtualenv
|
# via virtualenv
|
||||||
docutils==0.16
|
docutils==0.16
|
||||||
# via
|
# via
|
||||||
# sphinx
|
# sphinx
|
||||||
# sphinx-tabs
|
# sphinx-tabs
|
||||||
filelock==3.3.2
|
filelock==3.4.0
|
||||||
# via
|
# via
|
||||||
# tox
|
# tox
|
||||||
# virtualenv
|
# virtualenv
|
||||||
greenlet==1.1.2 ; python_version < "3.11"
|
greenlet==1.1.2 ; python_version < "3.11"
|
||||||
# via -r requirements/tests.in
|
# via -r requirements/tests.in
|
||||||
identify==2.3.3
|
identify==2.4.0
|
||||||
# via pre-commit
|
# via pre-commit
|
||||||
idna==3.3
|
idna==3.3
|
||||||
# via requests
|
# via requests
|
||||||
imagesize==1.2.0
|
imagesize==1.3.0
|
||||||
# via sphinx
|
# via sphinx
|
||||||
iniconfig==1.1.1
|
iniconfig==1.1.1
|
||||||
# via pytest
|
# via pytest
|
||||||
jinja2==3.0.2
|
jinja2==3.0.3
|
||||||
# via sphinx
|
# via sphinx
|
||||||
markupsafe==2.0.1
|
markupsafe==2.0.1
|
||||||
# via jinja2
|
# via jinja2
|
||||||
mypy==0.910
|
mypy==0.930
|
||||||
# via -r requirements/typing.in
|
# via -r requirements/typing.in
|
||||||
mypy-extensions==0.4.3
|
mypy-extensions==0.4.3
|
||||||
# via mypy
|
# via mypy
|
||||||
nodeenv==1.6.0
|
nodeenv==1.6.0
|
||||||
# via pre-commit
|
# via pre-commit
|
||||||
packaging==21.2
|
packaging==21.3
|
||||||
# via
|
# via
|
||||||
# pallets-sphinx-themes
|
# pallets-sphinx-themes
|
||||||
# pytest
|
# pytest
|
||||||
# sphinx
|
# sphinx
|
||||||
# tox
|
# tox
|
||||||
pallets-sphinx-themes==2.0.1
|
pallets-sphinx-themes==2.0.2
|
||||||
# via -r requirements/docs.in
|
# via -r requirements/docs.in
|
||||||
pep517==0.12.0
|
pep517==0.12.0
|
||||||
# via pip-tools
|
# via pip-tools
|
||||||
|
|
@ -76,23 +76,23 @@ pluggy==1.0.0
|
||||||
# via
|
# via
|
||||||
# pytest
|
# pytest
|
||||||
# tox
|
# tox
|
||||||
pre-commit==2.15.0
|
pre-commit==2.16.0
|
||||||
# via -r requirements/dev.in
|
# via -r requirements/dev.in
|
||||||
py==1.11.0
|
py==1.11.0
|
||||||
# via
|
# via
|
||||||
# pytest
|
# pytest
|
||||||
# tox
|
# tox
|
||||||
pycparser==2.20
|
pycparser==2.21
|
||||||
# via cffi
|
# via cffi
|
||||||
pygments==2.10.0
|
pygments==2.10.0
|
||||||
# via
|
# via
|
||||||
# sphinx
|
# sphinx
|
||||||
# sphinx-tabs
|
# sphinx-tabs
|
||||||
pyparsing==2.4.7
|
pyparsing==3.0.6
|
||||||
# via packaging
|
# via packaging
|
||||||
pytest==6.2.5
|
pytest==6.2.5
|
||||||
# via -r requirements/tests.in
|
# via -r requirements/tests.in
|
||||||
python-dotenv==0.19.1
|
python-dotenv==0.19.2
|
||||||
# via -r requirements/tests.in
|
# via -r requirements/tests.in
|
||||||
pytz==2021.3
|
pytz==2021.3
|
||||||
# via babel
|
# via babel
|
||||||
|
|
@ -104,9 +104,9 @@ six==1.16.0
|
||||||
# via
|
# via
|
||||||
# tox
|
# tox
|
||||||
# virtualenv
|
# virtualenv
|
||||||
snowballstemmer==2.1.0
|
snowballstemmer==2.2.0
|
||||||
# via sphinx
|
# via sphinx
|
||||||
sphinx==4.2.0
|
sphinx==4.3.2
|
||||||
# via
|
# via
|
||||||
# -r requirements/docs.in
|
# -r requirements/docs.in
|
||||||
# pallets-sphinx-themes
|
# pallets-sphinx-themes
|
||||||
|
|
@ -133,21 +133,22 @@ sphinxcontrib-serializinghtml==1.1.5
|
||||||
# via sphinx
|
# via sphinx
|
||||||
toml==0.10.2
|
toml==0.10.2
|
||||||
# via
|
# via
|
||||||
# mypy
|
|
||||||
# pre-commit
|
# pre-commit
|
||||||
# pytest
|
# pytest
|
||||||
# tox
|
# tox
|
||||||
tomli==1.2.2
|
tomli==2.0.0
|
||||||
# via pep517
|
# via
|
||||||
|
# mypy
|
||||||
|
# pep517
|
||||||
tox==3.24.4
|
tox==3.24.4
|
||||||
# via -r requirements/dev.in
|
# via -r requirements/dev.in
|
||||||
types-contextvars==2.4.0
|
types-contextvars==2.4.0
|
||||||
# via -r requirements/typing.in
|
# via -r requirements/typing.in
|
||||||
types-dataclasses==0.6.1
|
types-dataclasses==0.6.1
|
||||||
# via -r requirements/typing.in
|
# via -r requirements/typing.in
|
||||||
types-setuptools==57.4.2
|
types-setuptools==57.4.4
|
||||||
# via -r requirements/typing.in
|
# via -r requirements/typing.in
|
||||||
typing-extensions==3.10.0.2
|
typing-extensions==4.0.1
|
||||||
# via mypy
|
# via mypy
|
||||||
urllib3==1.26.7
|
urllib3==1.26.7
|
||||||
# via requests
|
# via requests
|
||||||
|
|
@ -155,7 +156,7 @@ virtualenv==20.10.0
|
||||||
# via
|
# via
|
||||||
# pre-commit
|
# pre-commit
|
||||||
# tox
|
# tox
|
||||||
wheel==0.37.0
|
wheel==0.37.1
|
||||||
# via pip-tools
|
# via pip-tools
|
||||||
|
|
||||||
# The following packages are considered to be unsafe in a requirements file:
|
# The following packages are considered to be unsafe in a requirements file:
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ babel==2.9.1
|
||||||
# via sphinx
|
# via sphinx
|
||||||
certifi==2021.10.8
|
certifi==2021.10.8
|
||||||
# via requests
|
# via requests
|
||||||
charset-normalizer==2.0.7
|
charset-normalizer==2.0.9
|
||||||
# via requests
|
# via requests
|
||||||
docutils==0.16
|
docutils==0.16
|
||||||
# via
|
# via
|
||||||
|
|
@ -18,31 +18,31 @@ docutils==0.16
|
||||||
# sphinx-tabs
|
# sphinx-tabs
|
||||||
idna==3.3
|
idna==3.3
|
||||||
# via requests
|
# via requests
|
||||||
imagesize==1.2.0
|
imagesize==1.3.0
|
||||||
# via sphinx
|
# via sphinx
|
||||||
jinja2==3.0.2
|
jinja2==3.0.3
|
||||||
# via sphinx
|
# via sphinx
|
||||||
markupsafe==2.0.1
|
markupsafe==2.0.1
|
||||||
# via jinja2
|
# via jinja2
|
||||||
packaging==21.2
|
packaging==21.3
|
||||||
# via
|
# via
|
||||||
# pallets-sphinx-themes
|
# pallets-sphinx-themes
|
||||||
# sphinx
|
# sphinx
|
||||||
pallets-sphinx-themes==2.0.1
|
pallets-sphinx-themes==2.0.2
|
||||||
# via -r requirements/docs.in
|
# via -r requirements/docs.in
|
||||||
pygments==2.10.0
|
pygments==2.10.0
|
||||||
# via
|
# via
|
||||||
# sphinx
|
# sphinx
|
||||||
# sphinx-tabs
|
# sphinx-tabs
|
||||||
pyparsing==2.4.7
|
pyparsing==3.0.6
|
||||||
# via packaging
|
# via packaging
|
||||||
pytz==2021.3
|
pytz==2021.3
|
||||||
# via babel
|
# via babel
|
||||||
requests==2.26.0
|
requests==2.26.0
|
||||||
# via sphinx
|
# via sphinx
|
||||||
snowballstemmer==2.1.0
|
snowballstemmer==2.2.0
|
||||||
# via sphinx
|
# via sphinx
|
||||||
sphinx==4.2.0
|
sphinx==4.3.2
|
||||||
# via
|
# via
|
||||||
# -r requirements/docs.in
|
# -r requirements/docs.in
|
||||||
# pallets-sphinx-themes
|
# pallets-sphinx-themes
|
||||||
|
|
|
||||||
|
|
@ -14,17 +14,17 @@ greenlet==1.1.2 ; python_version < "3.11"
|
||||||
# via -r requirements/tests.in
|
# via -r requirements/tests.in
|
||||||
iniconfig==1.1.1
|
iniconfig==1.1.1
|
||||||
# via pytest
|
# via pytest
|
||||||
packaging==21.2
|
packaging==21.3
|
||||||
# via pytest
|
# via pytest
|
||||||
pluggy==1.0.0
|
pluggy==1.0.0
|
||||||
# via pytest
|
# via pytest
|
||||||
py==1.11.0
|
py==1.11.0
|
||||||
# via pytest
|
# via pytest
|
||||||
pyparsing==2.4.7
|
pyparsing==3.0.6
|
||||||
# via packaging
|
# via packaging
|
||||||
pytest==6.2.5
|
pytest==6.2.5
|
||||||
# via -r requirements/tests.in
|
# via -r requirements/tests.in
|
||||||
python-dotenv==0.19.1
|
python-dotenv==0.19.2
|
||||||
# via -r requirements/tests.in
|
# via -r requirements/tests.in
|
||||||
toml==0.10.2
|
toml==0.10.2
|
||||||
# via pytest
|
# via pytest
|
||||||
|
|
|
||||||
|
|
@ -6,21 +6,21 @@
|
||||||
#
|
#
|
||||||
cffi==1.15.0
|
cffi==1.15.0
|
||||||
# via cryptography
|
# via cryptography
|
||||||
cryptography==35.0.0
|
cryptography==36.0.1
|
||||||
# via -r requirements/typing.in
|
# via -r requirements/typing.in
|
||||||
mypy==0.910
|
mypy==0.930
|
||||||
# via -r requirements/typing.in
|
# via -r requirements/typing.in
|
||||||
mypy-extensions==0.4.3
|
mypy-extensions==0.4.3
|
||||||
# via mypy
|
# via mypy
|
||||||
pycparser==2.20
|
pycparser==2.21
|
||||||
# via cffi
|
# via cffi
|
||||||
toml==0.10.2
|
tomli==2.0.0
|
||||||
# via mypy
|
# via mypy
|
||||||
types-contextvars==2.4.0
|
types-contextvars==2.4.0
|
||||||
# via -r requirements/typing.in
|
# via -r requirements/typing.in
|
||||||
types-dataclasses==0.6.1
|
types-dataclasses==0.6.1
|
||||||
# via -r requirements/typing.in
|
# via -r requirements/typing.in
|
||||||
types-setuptools==57.4.2
|
types-setuptools==57.4.4
|
||||||
# via -r requirements/typing.in
|
# via -r requirements/typing.in
|
||||||
typing-extensions==3.10.0.2
|
typing-extensions==4.0.1
|
||||||
# via mypy
|
# via mypy
|
||||||
|
|
|
||||||
|
|
@ -689,7 +689,7 @@ def get_root_path(import_name: str) -> str:
|
||||||
# Module already imported and has a file attribute. Use that first.
|
# Module already imported and has a file attribute. Use that first.
|
||||||
mod = sys.modules.get(import_name)
|
mod = sys.modules.get(import_name)
|
||||||
|
|
||||||
if mod is not None and hasattr(mod, "__file__"):
|
if mod is not None and hasattr(mod, "__file__") and mod.__file__ is not None:
|
||||||
return os.path.dirname(os.path.abspath(mod.__file__))
|
return os.path.dirname(os.path.abspath(mod.__file__))
|
||||||
|
|
||||||
# Next attempt: check the loader.
|
# Next attempt: check the loader.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue