From ba8012a85366b0ea8f16333a75f3c5b54cd1fef2 Mon Sep 17 00:00:00 2001 From: "github-classroom[bot]" <66690702+github-classroom[bot]@users.noreply.github.com> Date: Thu, 29 Sep 2022 10:07:45 +0000 Subject: [PATCH] Initial commit --- .env | 4 + .flaskenv | 2 + .gitignore | 135 +++++++++ .vscode/settings.json | 9 + LICENSE | 674 ++++++++++++++++++++++++++++++++++++++++++ README.md | 144 +++++++++ requirements.txt | 7 + start.sh | 38 +++ static/favico.png | Bin 0 -> 1234 bytes static/flask-icon.png | Bin 0 -> 6933 bytes static/flask.png | Bin 0 -> 15262 bytes static/flasks.png | Bin 0 -> 16455 bytes static/styles.css | 63 ++++ templates/abc.html | 30 ++ templates/base.html | 64 ++++ templates/info.html | 11 + webface.py | 48 +++ wsgi-template.py | 12 + 18 files changed, 1241 insertions(+) create mode 100644 .env create mode 100644 .flaskenv create mode 100644 .gitignore create mode 100644 .vscode/settings.json create mode 100644 LICENSE create mode 100644 README.md create mode 100644 requirements.txt create mode 100755 start.sh create mode 100644 static/favico.png create mode 100644 static/flask-icon.png create mode 100644 static/flask.png create mode 100644 static/flasks.png create mode 100644 static/styles.css create mode 100644 templates/abc.html create mode 100644 templates/base.html create mode 100644 templates/info.html create mode 100644 webface.py create mode 100644 wsgi-template.py diff --git a/.env b/.env new file mode 100644 index 0000000..d89cb66 --- /dev/null +++ b/.env @@ -0,0 +1,4 @@ +FLASK_APP=webface +FLASK_RUN_PORT=54321 +FLASK_ENV=development +#FLASK_DEBUG=1 diff --git a/.flaskenv b/.flaskenv new file mode 100644 index 0000000..eb74e69 --- /dev/null +++ b/.flaskenv @@ -0,0 +1,2 @@ +FLASK_APP=webface +FLASK_ENV=production diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bc68f1d --- /dev/null +++ b/.gitignore @@ -0,0 +1,135 @@ +*.swp +webface/*.sqlite +*/*.sqlite +#.vscode + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +.venv-* +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..2f97bb1 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,9 @@ +{ + "files.associations": { + "*.html": "jinja-html" + }, + "emmet.includeLanguages": { + "jinja-html": "html", + "vue-html": "html" + } +} \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..324a7b3 --- /dev/null +++ b/README.md @@ -0,0 +1,144 @@ +Flask Start OneFile +========================= + +[flask]: https://flask.palletsprojects.com + +Tento repositář má vám i mě usnadnit založení nového projektu pro framework +[Flask][]. Zde najdete základní adresářovou strukturu pro aplikaci a kostru +aplikace. + +Pokud je aplikace složitější a místo jednoho souboru chce balíček, mrkněte se na +[Flask Start](https://github.com/spseol/flask-start) + + +## ... jak na to? + + +Dejme tomu že začínám nový projekt. Bude se jmenovat třeba *Foo*. Můžete si +repositář [forknout](htts://help.github.com/articles/fork-a-repo/) nebo +[naklonovat](https://help.github.com/articles/cloning-a-repository/) ale +nejlepší je **[použít +šablonu](https://github.com/spseol/flask-start-onefile/generate)** -- tím se +vytvoří váš vlastní repositář s novou historií a ten si +[naklonujete](https://help.github.com/articles/cloning-a-repository/). + + +Repositář obsahuje skript **`start.sh`**, který vše další udělá za vás. + * vytvoří virtuální prostředí + * nainstaluje potřebné balíčky + * přestane sledovat .env + * smaže sám sebe + +Pokud chcete mít kontrolu, můžete pokračovat a všechno si pěkně udělat [růčo](#růčo). + +VSCode +----------- + +V souboru [settings.json](.vscode/settings.json) je nastavení, které vám zajistí +očekávané chování VSCode. + +```json +{ + "files.associations": { + "*.html": "jinja-html" + }, + "emmet.includeLanguages": { + "jinja-html": "html", + "vue-html": "html" + } +``` + +Doporučuji ještě doinstalovat si následující rozšíření: + * aby se vám lépe psalo: + * [Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python) + * [Happy Flasker](https://marketplace.visualstudio.com/items?itemName=apedroed.Happy-Flasker) + * [Better Jinja](https://marketplace.visualstudio.com/items?itemName=samuelcolvin.jinjahtml) + * aby se vám lépe pracovalo s Gitem + * [Git Extension Pack](https://marketplace.visualstudio.com/items?itemName=donjayamanne.git-extension-pack) + * aby se vám automaticky znovu načetla stránka v prohlížeči při změně zdrojového kódu + * [Live Reload](https://marketplace.visualstudio.com/items?itemName=Phu1237.live-reload) + +LiveReload +---------------- + +LiveReload je udělátko, které slouží k automatickému znovu-načtení webové +stránky při vývoji webových aplikací. Na jedné straně je vždy [rozšíření v +prohlížeči](https://chrome.google.com/webstore/detail/livereload/jnihajbhpnppcggbcgedagnkighmdlei) +nebo [JS knihovna](https://github.com/livereload/livereload-js). + +Na druhé straně je aplikace, která hlídá změny v souborech a pokud se něco +změní pošle do prohlížeče povel k znovu-načtení stránky. Tato aplikace má více +různých implementací: + +* [VSCode](https://marketplace.visualstudio.com/search?term=livereload&target=VSCode&category=All%20categories&sortBy=Relevance): +* Python: +* Ruby: + +### Jak si rozjet Live Reload + +1. Nainstalujete si [rozšíření do prohlížeče](https://chrome.google.com/webstore/detail/livereload/jnihajbhpnppcggbcgedagnkighmdlei) +2. Nainstalujete si [rozšíření do VSCode](https://marketplace.visualstudio.com/search?term=livereload&target=VSCode&category=All%20categories&sortBy=Relevance) +3. Ve VSCode přes Ctrl+Shift+P spustíte Liver Reload nebo si v nastavení zapnete, aby se spuštělo samo při startu VSCode +4. V prohlížeči kliknete na ikonku, aby se provedlo spojení VSCode a prohlížeče. + +A je to! + +Několik užitečných odkazů pro začátek +------------------------------------------ + +* [Explore Flask](https://exploreflask.com/) +* [The Flask Mega-Tutorial](https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world) +--------------------------------------------------------------------------- +* +* +* +* +--------------------------------------------------------------------------- +* [w3schools.com](https://www.w3schools.com/) ,[Jak psát web](https://www.jakpsatweb.cz/) +* [Flask docs][flask], [Flask Quick start](https://flask.palletsprojects.com/quickstart/) +* [Template Designer Documentation](https://jinja.palletsprojects.com/templates/) +* [Bábot](https://www.blabot.cz/) +* [Clker.com](http://www.clker.com/), [Commons](https://commons.wikimedia.org), + [pixabay](https://pixabay.com/), [Unsplash](https://unsplash.com/) +--------------------------------------------------------------------------- + +## Růčo + +1. Vytvořím si [virtuální prostředí](https://virtualenv.pypa.io/en/stable/) + právě pro aplikaci *Foo*.: + +```bash +python3 -m venv .venv-foo +``` + +2. Virtuální prostředí si aktivuji: + +```bash +source .venv-foo/bin/activate +``` +nebo na Windows: +``` +.venv-foo\Scripts\activate + +``` + +3. Do virtuálního prostředí nainstaluji potřebné moduly: + +```bash +pip install -r requirements.txt +``` +nebo ručně nestručně: + +```bash +pip install flask flask-socketio +pip install flask-mail flask-misaka +pip install psycopg2 pony +``` + + +4. A teď stačí spustit vývojový server: + +``` +flask run +``` + diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..40ac828 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,7 @@ +Flask +python-dotenv +#Flask-misaka +#Flask-WTF +#Flask-Login +#Flask-mail +#pony diff --git a/start.sh b/start.sh new file mode 100755 index 0000000..ea6b6db --- /dev/null +++ b/start.sh @@ -0,0 +1,38 @@ +#!/bin/sh +# * nainstaluje virtuální prostředí +# * nainstaluje závislosti přes PIP +# * zakáže v Gitu .env +# * smaže se +############################################################ + +DIRNAME=$(dirname $0) +cd $DIRNAME +BASENAME=$(basename $PWD) + +python3 -m venv .venv-${BASENAME} +. .venv-${BASENAME}/bin/activate + +pip install -U pip +pip install -r requirements.txt + +git rm --cached .env + +echo "\nMůžu se smazat? Y/n" +read anone +if [ -z $anone ] || [ $anone != n ]; then + git rm $(basename $0) +else + echo "... no dobře, ale být tebou, tak bych mě vymazal!" +fi + +#git commit -m 'new Init' + +echo "Pro aktivaci virtuálního prostředí použij: + +source .venv-${BASENAME}/bin/activate + +nebo + +. .venv-${BASENAME}/bin/activate + +" diff --git a/static/favico.png b/static/favico.png new file mode 100644 index 0000000000000000000000000000000000000000..f6123b3866846525af05a3a7985cb36f3aac0780 GIT binary patch literal 1234 zcmaJ^0=-mP*7MrCc-&%c)avAyKI&wDTLlTY&AyPBRF zzsYZh9{^xeVgfD$#Vx1@`m94^m9f!?!uq0^lo$Y*H#fR-H=uQJenLhH05u^1oVx(P z3fekn2jCVZ++>gsCU!;WSq)GbgHl~qEBL8o86S>N)6C1CQAg5zXJZcwO~ zZ#A^G_QD;!5uVH-MPAf4(pW;($dr@Lm2t$A!&=9vZm#YT6U{|hyIePSyRrSByot_} z>(!9CC5t>1Hv+>7NimCdROwBb)5H zgQ$6~KEZREQp{$J4{>MP#nN7}mO+)NxX#|eNrqa+>Qo8X#-~yd8`jXTNff>I9!SGt zs35k!>rX_&H9vc-6hmeXG(o?B%D?0Z^v}e~-abvo-H|bw6&loc3K4kRh8UM7tjk)5 zd&224FM2fgza|`R^MXe@^}@8^QJ7zAU2d(@t()`A%&l;nC&g_J3C$&;Ii)n0PWr09 z?767I0#}&fa^hAMRhUF%i=^7BXU%g;HN#{pTw&2Ryrfek!txmr$s#*zGY%}W ziWM-)GTl1gMuho9!{}wltYDE@D4*?Fd|E2xl}(ArR@HB=S$L5~7=}qEah25uFSi#B zTLeqp#bYqZJWR2OPgx~3Hsp%Kz+C9KF6+KA#-@&QZ%y)Qb^JO#+&m*=niPDi7IB~# z&kM==5PgwCN=E7t6#v(}>+CT}E0ABpy8)l?S9rdc^t&+T>UDL>kE30l6J8HxK?mpD z1n(AjD{f)sm|t7pmW+kvZ2sVzH}muL9#8$w=B1_Pod-B)j-oPa@{;0ln~4LMG_>$7 zPsk<%u=(wKU-LV@6N@&zDTyg@-sTOT`mfzu3qlW|ob`#gn9Pq<`FPYa)030Zko1hg zyh5;U+tI-Bk@nK4lizsl#%sq$ByyF~$`9pV4d=H#+88jVvYmg$+3x=;GIFE;uT}Tg z_KQL;#=*NDx14d~dFSp{XIIA&eqddE9DL>LFG~qOAIZteGT`&~eBl?crMsJ0dfe;$ zA4k38E4;jX6ThN+#JE%(;}HJ*-*Fv_CjbBd literal 0 HcmV?d00001 diff --git a/static/flask-icon.png b/static/flask-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..55cb8478ef215c3735a12cf5e4c902b967c0054f GIT binary patch literal 6933 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 + +

Flask pokus

+
    + {% for s in slova %} +
  • Je to {{s}}.
  • + {% endfor %} +
+ +{% for i in range(1,7) %} + Mám prima den cislo {{ i }} +

ajajajaj

+{% endfor %} + +

{{ 2**128 }}

+ +

Ukázková aplikace pro web framework + Flask.

+ +

Zdrojové kódy najdete na Githubu.

+ + +{% endblock obsah %} + diff --git a/templates/base.html b/templates/base.html new file mode 100644 index 0000000..925dc41 --- /dev/null +++ b/templates/base.html @@ -0,0 +1,64 @@ + + + + + + {%block title%}FlaskTemplate{%endblock%} + + + + + + + + + +Fork me on GitHub + + + + + +{% block obsah %} + +{#{% filter markdown %}#} + +# Flask + +Startovací šablona pro webový framework Flask. + +![Flaštička]({{ url_for('static', filename='flask.png') }}) +![Flaštičky]({{ url_for('static', filename='flasks.png') }}) + +{#{% endfilter %}#} + + + +{% endblock obsah %} + +
+{#{% filter markdown %}#} +Užitečné odkazy: + +* HTML, +* CSS, +* Python, +* Flask, +* Jinja2 + +{#{% endfilter %}#} +
+ + + + + + diff --git a/templates/info.html b/templates/info.html new file mode 100644 index 0000000..2f1ab41 --- /dev/null +++ b/templates/info.html @@ -0,0 +1,11 @@ +{% extends 'base.html.j2' %} + +{%block title%}Informace{%endblock%} + +{% block obsah %} + +

Info

+ +

2 na 128 je {{2**128}}

+ +{% endblock obsah %} diff --git a/webface.py b/webface.py new file mode 100644 index 0000000..857ea93 --- /dev/null +++ b/webface.py @@ -0,0 +1,48 @@ +from flask import Flask, render_template, request, redirect, url_for, session +import functools + +# from werkzeug.security import generate_password_hash, check_password_hash + +app = Flask(__name__) +app.secret_key = b"totoj e zceLa n@@@hodny retezec nejlep os.urandom(24)" +app.secret_key = b"x6\x87j@\xd3\x88\x0e8\xe8pM\x13\r\xafa\x8b\xdbp\x8a\x1f\xd41\xb8" + + +slova = ("Super", "Perfekt", "Úža", "Flask") + + +def prihlasit(function): + @functools.wraps(function) + def wrapper(*args, **kwargs): + if "user" in session: + return function(*args, **kwargs) + else: + return redirect(url_for("login", url=request.path)) + + return wrapper + + +@app.route("/", methods=["GET"]) +def index(): + return render_template("base.html") + + +@app.route("/info/") +def info(): + return render_template("info.html") + + +@app.route("/abc/") +def abc(): + return render_template("abc.html", slova=slova) + + +@app.route("/text/") +def text(): + return """ + +

Text

+ +

toto je text

+ +""" diff --git a/wsgi-template.py b/wsgi-template.py new file mode 100644 index 0000000..d6ed213 --- /dev/null +++ b/wsgi-template.py @@ -0,0 +1,12 @@ +# Change working directory so relative paths (and template lookup) work again +import os +import sys + +dir = os.path.dirname(__file__) +os.chdir( dir ) +sys.path.insert(0, dir ) + +import debugapp +application = debugapp.app + +# vim: ft=python