Skip to content

Commit dd9aaac

Browse files
committed
feat/docs: improve code, fix bugs, create new page in ru docs
1 parent 152d159 commit dd9aaac

File tree

16 files changed

+354
-14
lines changed

16 files changed

+354
-14
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
commit 152d1596a07e0f836a228eb0ae02304af5470474
2+
Author: alexeev-prog <[email protected]>
3+
Date: Mon Oct 28 23:40:27 2024 +0700
4+
5+
docs: update docs
6+
17
commit a8690ed649529baa6a8fd31eebd1b96ee9d9ad3c
28
Author: alexeev-prog <[email protected]>
39
Date: Mon Oct 28 23:38:57 2024 +0700

Doxyfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ PROJECT_NAME = "pyEchoNext"
4848
# could be handy for archiving the generated documentation or if some version
4949
# control system is used.
5050

51-
PROJECT_NUMBER = "0.3.1"
51+
PROJECT_NUMBER = "0.4.1"
5252

5353
# Using the PROJECT_BRIEF tag one can provide an optional one line description
5454
# for a project that appears at the top of each page and should give viewer a

README.md

Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# 🌟 **Echonext: The Future of Web Development in Python!** 🚀
1+
# 🌟 **EchoNext: The Future of Web** 🚀
22
<a id="readme-top"></a>
33

44
<div align="center">
@@ -102,6 +102,20 @@ pip install pyechonext
102102

103103
Once installed, you can start using the library in your Python projects. Check out the [documentation](https://alexeev-prog.github.io/pyEchoNext) for detailed usage examples and API reference.
104104

105+
You can create example app architecture:
106+
107+
```bash
108+
python3 -m pyechonext --name exampleapp
109+
110+
# Generated arhitecture:
111+
exampleapp/
112+
├── exampleapp.py
113+
├── templates
114+
└── views
115+
├── __init__.py
116+
└── main.py
117+
```
118+
105119
<p align="right">(<a href="#readme-top">back to top</a>)</p>
106120

107121
## 💻 Usage Examples
@@ -183,14 +197,14 @@ def home(request, response):
183197
user = User(name="John", cash=100.0)
184198
session.add(user)
185199
session.commit()
186-
response.body = "Hello from the HOME page"
200+
return "Hello from the HOME page"
187201

188202

189203
@echonext.route_page("/users")
190204
def about(request, response):
191205
users = session.get_all_by_model(User)
192206

193-
response.body = f"Users: {[f'{user.name}: {user.cash}$' for user in users]}"
207+
return f"Users: {[f'{user.name}: {user.cash}$' for user in users]}"
194208

195209
```
196210

@@ -275,6 +289,41 @@ class IndexView(View):
275289
return "Message has accepted!"
276290
```
277291

292+
Or you can return response:
293+
294+
```python
295+
class IndexView(View):
296+
def get(self, request: Request, response: Response, **kwargs):
297+
"""
298+
Get
299+
300+
:param request: The request
301+
:type request: Request
302+
:param response: The response
303+
:type response: Response
304+
:param args: The arguments
305+
:type args: list
306+
:param kwargs: The keywords arguments
307+
:type kwargs: dictionary
308+
"""
309+
return Response(body="Hello World!")
310+
311+
def post(self, request: Request, response: Response, **kwargs):
312+
"""
313+
Post
314+
315+
:param request: The request
316+
:type request: Request
317+
:param response: The response
318+
:type response: Response
319+
:param args: The arguments
320+
:type args: list
321+
:param kwargs: The keywords arguments
322+
:type kwargs: dictionary
323+
"""
324+
return Response(body="Message has accepted!")
325+
```
326+
278327
## 💬 Support
279328
If you encounter any issues or have questions about pyEchoNext, please:
280329

SECURITY.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@ currently being supported with security updates.
77

88
| Version | Supported |
99
| ------- | ------------------ |
10+
| 0.4.1 | :white_check_mark: |
11+
| 0.3.1 | :white_check_mark: |
1012
| 0.3.1 | :white_check_mark: |
1113
| 0.2.1 | :white_check_mark: |
1214
| 0.1.1 | :white_check_mark: |
13-
| 0.1.0 | :x |
15+
| 0.1.0 | :x: |
1416

1517
## Reporting a Vulnerability
1618

docs/ru/index.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
## Содержание
44

55
+ [Устройство веб-фреймворка](./webframework_design.md)
6+
+ [Создание веб-приложения](./webapp_creation.md)
67

78
## Дополнительные материалы
89

docs/ru/webapp_creation.md

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
# pyEchoNext / создание веб-приложения
2+
Создать приложение не является сложным в pyEchoNext. Благодаря модульности и универсальности можно настроить многие параметры и использовать разные методы создания маршрутов веб-приложения.
3+
4+
> В скобках может быть указан нужный модуль для импортирования, т.е. где хранится данная абстракция. ex. EchoNext (pyechonext.app): from echonext.app import EchoNext
5+
6+
Основной является класс EchoNext (pyechonext.app):
7+
8+
```python
9+
echonext = Echonext(app_name: str,
10+
settings: Settings,
11+
urls: Optional[List[URL]],
12+
application_type: Optional[ApplicationType])
13+
```
14+
15+
## URLS
16+
По умолчанию `urls` равен пустому списку. urls содержит в себе экземпляры датакласса URL (pyechonext.urls):
17+
18+
```python
19+
@dataclass
20+
class URL:
21+
url: str
22+
view: Type[View]
23+
```
24+
25+
View - это и есть абстракция маршрута сайта (django-like). Он обязательно должен иметь два метода: `get` и `post` (для ответа на get и post запросы). Эти методы должны возвращать:
26+
27+
+ Данные, контент страницы. Это может быть словарь или строка.
28+
29+
ИЛИ:
30+
31+
+ Объект класса Response (pyechonext.response)
32+
33+
View представляет собой объект класса View (pyechonext.views):
34+
35+
```python
36+
class View(ABC):
37+
"""
38+
Page view
39+
"""
40+
41+
@abstractmethod
42+
def get(self, request: Request, response: Response, *args, **kwargs) -> Union[Response, Any]:
43+
"""
44+
Get
45+
46+
:param request: The request
47+
:type request: Request
48+
:param response: The response
49+
:type response: Response
50+
:param args: The arguments
51+
:type args: list
52+
:param kwargs: The keywords arguments
53+
:type kwargs: dictionary
54+
"""
55+
raise NotImplementedError
56+
57+
@abstractmethod
58+
def post(self, request: Request, response: Response, *args, **kwargs) -> Union[Response, Any]:
59+
"""
60+
Post
61+
62+
:param request: The request
63+
:type request: Request
64+
:param response: The response
65+
:type response: Response
66+
:param args: The arguments
67+
:type args: list
68+
:param kwargs: The keywords arguments
69+
:type kwargs: dictionary
70+
"""
71+
raise NotImplementedError
72+
```
73+
74+
Для примера, в pyechonext.views есть IndexView, пример реализации View.
75+
76+
```python
77+
class IndexView(View):
78+
def get(self, request: Request, response: Response, **kwargs) -> Union[Response, Any]:
79+
"""
80+
Get
81+
82+
:param request: The request
83+
:type request: Request
84+
:param response: The response
85+
:type response: Response
86+
:param args: The arguments
87+
:type args: list
88+
:param kwargs: The keywords arguments
89+
:type kwargs: dictionary
90+
"""
91+
return "Hello World!"
92+
93+
def post(self, request: Request, response: Response, **kwargs) -> Union[Response, Any]:
94+
"""
95+
Post
96+
97+
:param request: The request
98+
:type request: Request
99+
:param response: The response
100+
:type response: Response
101+
:param args: The arguments
102+
:type args: list
103+
:param kwargs: The keywords arguments
104+
:type kwargs: dictionary
105+
"""
106+
return "Message has accepted!"
107+
```
108+
109+
Эта реализация возвращает строку. Но также можно возвратить Response:
110+
111+
```python
112+
class IndexView(View):
113+
def get(self, request: Request, response: Response, **kwargs) -> Union[Response, Any]:
114+
"""
115+
Get
116+
117+
:param request: The request
118+
:type request: Request
119+
:param response: The response
120+
:type response: Response
121+
:param args: The arguments
122+
:type args: list
123+
:param kwargs: The keywords arguments
124+
:type kwargs: dictionary
125+
"""
126+
return Response(body='Hello World!')
127+
128+
def post(self, request: Request, response: Response, **kwargs) -> Union[Response, Any]:
129+
"""
130+
Post
131+
132+
:param request: The request
133+
:type request: Request
134+
:param response: The response
135+
:type response: Response
136+
:param args: The arguments
137+
:type args: list
138+
:param kwargs: The keywords arguments
139+
:type kwargs: dictionary
140+
"""
141+
return Response(body='Message has accepted!')
142+
```
143+
144+
Можно комбинировать эти два способа. По их использованию есть следующие рекомендации:
145+
146+
1. Если метод только возвращает уже подготовленные данные, то не следует возвращать Response, возвращайте данные.
147+
2. Если метод работает с переданным ему response, то возвращайте данные или сам переданный в аргументах response.
148+
3. В остальных случаях можно создавать Response и возвращать его, а не данные.
149+
4. В get и post методе стоит использовать только один способ, не стоит их смешивать. Но если без этого не обойтись, то эту рекомендацию можно нарушить.
150+
151+
Эти рекомендации могут нарушаться по желанию разработчика.
152+
153+
Также вместо возвращения результата можно вызывать исключения WebError: URLNotFound и MethodNotAllow. В таком случае приложение не прекратит свою работу, а будет выводить ошибку на стороне веб-страницы. В случае же другого исключения приложение прекратит свою работу.
154+
155+
## Settings
156+
Данный аргумент является экземпляром датакласса Settings (pyechonext.config)
157+
158+
---
159+
160+
[Содержание](./index.md)

examples/simple_app.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,11 @@ def home(request, response):
2929
user = User(name="John", cash=100.0)
3030
session.add(user)
3131
session.commit()
32-
response.body = "Hello from the HOME page"
32+
return "Hello from the HOME page"
3333

3434

3535
@echonext.route_page("/users")
3636
def about(request, response):
3737
users = session.get_all_by_model(User)
3838

39-
response.body = f"Users: {[f'{user.name}: {user.cash}$' for user in users]}"
39+
return f"Users: {[f'{user.name}: {user.cash}$' for user in users]}"

examples/webapp.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import os
2+
from pyechonext.utils.exceptions import MethodNotAllow
23
from pyechonext.app import ApplicationType, EchoNext
34
from pyechonext.views import View
45
from pyechonext.urls import URL, IndexView
@@ -13,7 +14,7 @@ def get(self, request, response, **kwargs):
1314
)
1415

1516
def post(self, request, response, **kwargs):
16-
return Response(body='post users')
17+
raise MethodNotAllow(f'Request {request.path}: method not allow')
1718

1819

1920
url_patterns = [URL(url="/", view=IndexView), URL(url="/users", view=UsersView)]

0 commit comments

Comments
 (0)