# fastapi_framework
A mvc framework used FastApi
Simple and elegant use of FastApi in MVC mode
[Demo](https://framework.2rails.cn/)
### deploy one click on vercel:
[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fsmjkzsl%2Ffastapi-mvc-framework&project-name=fastapi-mvc-framework&repository-name=fastapi-mvc-framework)
## usage:
install:
```sh
pip install fastapi-mvc-framework
```
controller:
```python
from fastapi_mvc_framework import api_router,api,Request,Response,BaseController,application,WebSocket,WebSocketDisconnect,UploadFile,File
from typing import Dict ,List
application._public_auth_url = '/user/login'
application._user_auth_url = '/user/login'
@api_router(auth='public')
class TestController(BaseController):
@api.get("/user/login" )
def login(self):
""":title Login"""
redirect = self.get_param('redirect') if self.get_param('redirect') else '/'
return self.view()
@api.post("/test/verity_user",auth="none")
async def verity_user(self):
username = self['username']
password = self['password']
redirect = self['redirect']
if username and password:
#do veritied
if username in ['bruce','alice'] and password:
return self._verity_successed(username,redirect)
else:
return self._verity_error()
return self._verity_error()
@api.get("/user/logout")
def logout(self):
return self._user_logout()
@api.post("/test/upload")
async def upload_test(self,files:List[UploadFile]=File(...)):
p = {}
for file in files:
path,url = await self.getUploadFile(file)
p[file.filename] = [path,url]
return {"files":p}
@api.get("/",auth='none' )
def home(self,request:Request):
'''
:title Home
'''
c = self.session.get('home',1)
c = c+1
self.cookies["a"] = c
if c>10:
del self.cookies["a"]
c = 0
self.session['home'] = c
text = "Hello World! I'm in FastapiMvcFramework"
routers_map = application.routers_map
routers = application.routes
return self.view()
@api.get("/xml",auth='user')
def get_legacy_data(self):
""":title XML(only bruce)"""
data = """<?xml version="1.0"?>
<shampoo>
<Header>
Apply shampoo here.
</Header>
<Body>
You'll have to use soap here.
</Body>
</shampoo>
"""
return self.view(content=data,media_type="application/xml")
@api.get("/chatgpt",auth="user")
def chatgpt(self):
"""
:title Chat(only alice)
"""
return self.view()
websockets:Dict[str,WebSocket] = {}
@api_router(path="/{controller}")
class WSController(BaseController):
def __init__(self) -> None:
super().__init__()
@api.get("/" )
def ws_home(self):
""":title WebSocketDemo"""
return self.view()
@api.websocket("/chat/{client_id}")
async def websocket_endpoint(self, websocket: WebSocket,client_id: int):
await websocket.accept()
websockets[client_id]=(websocket)
try:
while True:
data = await websocket.receive_text()
await websocket.send_text(f"You wrote: {data}" )
for clientid in websockets:
if client_id!=clientid:
await websockets[clientid].send_text(f"Client #{client_id} says: {data}")
except WebSocketDisconnect:
websockets.remove(websocket)
for connection in websockets:
await connection.send_text(f"Client #{client_id} left the chat")
```
home.html:
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>FastApi MVC Framework</title>
<link rel="stylesheet" href="home.css" />
</head>
<body>
<header style="text-align:left;display: flex;">
<h1>Python</h1>
<h4>on FastApi</h4>
</header>
<nav>
{% for item in routers_map %} {% if 'GET' in routers_map[item]['methods'] %} {% if routers_map[item]['auth']=='none' or request.session['user'] %}
<a href="{{routers_map[item]['path']}}">{{routers_map[item]['doc']
and routers_map[item]['doc']['title'] or item}}</a> {% endif %} {% endif %} {% endfor %}
<a href="#">About</a>
<a href="#">Contact</a> {% if request.session['user'] %}
<a href="/user/logout"><b>{{request.session['user']['username']}}</b>
Logout</a> {% endif %}
</nav>
<section>
<h2>Welcome to my website</h2>
<p>This is an example of a responsive design that works well on both desktop and mobile devices.</p>
<p>here is the `text` variable in class method:{{text}}</p>
<p style="color:red"><b>{{flash}}</b></p>
</section>
<footer>
<p>© 2023 My Website</p>
</footer>
</body>
</html>
```
your project directory structrue like this:
```dir
\APP
| __init__.py
|
+---controllers
| | test_controller.py
| | __init__.py
| |
+---models
| | models.py
| | __init__.py
| |
+---services
| | user_service.py
| | __init__.py
| |
+---tests
| | test_test.py
| |
+---views
| +---abc
| | \---2.0
| | css.css
| | home.html
| |
| +---test
| | chatgpt.css
| | chatgpt.html
| | chatgpt.js
| | home.html
| | home.js
| | login.html
| |
| \---ws
| ws_home.html
|
```
Raw data
{
"_id": null,
"home_page": "https://github.com/smjkzsl/fastapi_framework",
"name": "fastapi-mvc-framework",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.6",
"maintainer_email": "",
"keywords": "web framework,mvc framework,fastapi framework",
"author": "Bruce chou",
"author_email": "smjkzsl@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/0a/16/a6b3e6173f6fcabcd3597ed4877a2042ed73bd8527d7775ae661e9e4aa1e/fastapi_mvc_framework-1.2.4.tar.gz",
"platform": null,
"description": "# fastapi_framework\r\nA mvc framework used FastApi\r\nSimple and elegant use of FastApi in MVC mode\r\n\r\n[Demo](https://framework.2rails.cn/) \r\n\r\n### deploy one click on vercel:\r\n[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fsmjkzsl%2Ffastapi-mvc-framework&project-name=fastapi-mvc-framework&repository-name=fastapi-mvc-framework)\r\n\r\n## usage:\r\ninstall:\r\n```sh\r\npip install fastapi-mvc-framework\r\n```\r\n\r\ncontroller:\r\n```python\r\n\r\nfrom fastapi_mvc_framework import api_router,api,Request,Response,BaseController,application,WebSocket,WebSocketDisconnect,UploadFile,File\r\nfrom typing import Dict ,List\r\n \r\n\r\napplication._public_auth_url = '/user/login'\r\napplication._user_auth_url = '/user/login'\r\n\r\n@api_router(auth='public')\r\nclass TestController(BaseController): \r\n @api.get(\"/user/login\" )\r\n def login(self):\r\n \"\"\":title Login\"\"\" \r\n redirect = self.get_param('redirect') if self.get_param('redirect') else '/' \r\n return self.view() \r\n @api.post(\"/test/verity_user\",auth=\"none\")\r\n async def verity_user(self): \r\n username = self['username']\r\n password = self['password']\r\n redirect = self['redirect']\r\n if username and password:\r\n #do veritied\r\n if username in ['bruce','alice'] and password:\r\n return self._verity_successed(username,redirect)\r\n else:\r\n return self._verity_error() \r\n return self._verity_error()\r\n \r\n @api.get(\"/user/logout\")\r\n def logout(self):\r\n return self._user_logout()\r\n \r\n @api.post(\"/test/upload\")\r\n async def upload_test(self,files:List[UploadFile]=File(...)):\r\n p = {}\r\n for file in files:\r\n path,url = await self.getUploadFile(file)\r\n p[file.filename] = [path,url]\r\n return {\"files\":p} \r\n \r\n \r\n @api.get(\"/\",auth='none' )\r\n def home(self,request:Request): \r\n '''\r\n :title Home\r\n '''\r\n c = self.session.get('home',1)\r\n c = c+1 \r\n self.cookies[\"a\"] = c\r\n if c>10:\r\n del self.cookies[\"a\"]\r\n c = 0\r\n self.session['home'] = c\r\n text = \"Hello World! I'm in FastapiMvcFramework\"\r\n routers_map = application.routers_map\r\n routers = application.routes \r\n return self.view()\r\n \r\n @api.get(\"/xml\",auth='user')\r\n def get_legacy_data(self):\r\n \"\"\":title XML(only bruce)\"\"\"\r\n\r\n data = \"\"\"<?xml version=\"1.0\"?>\r\n <shampoo>\r\n <Header>\r\n Apply shampoo here.\r\n </Header>\r\n <Body>\r\n You'll have to use soap here.\r\n </Body>\r\n </shampoo>\r\n \"\"\"\r\n return self.view(content=data,media_type=\"application/xml\")\r\n \r\n @api.get(\"/chatgpt\",auth=\"user\")\r\n def chatgpt(self):\r\n \"\"\"\r\n :title Chat(only alice)\r\n \"\"\"\r\n return self.view()\r\n\r\n\r\n \r\n \r\nwebsockets:Dict[str,WebSocket] = {}\r\n\r\n@api_router(path=\"/{controller}\")\r\nclass WSController(BaseController): \r\n def __init__(self) -> None:\r\n super().__init__()\r\n \r\n @api.get(\"/\" )\r\n def ws_home(self):\r\n \"\"\":title WebSocketDemo\"\"\"\r\n return self.view()\r\n\r\n @api.websocket(\"/chat/{client_id}\")\r\n async def websocket_endpoint(self, websocket: WebSocket,client_id: int):\r\n await websocket.accept()\r\n websockets[client_id]=(websocket)\r\n try:\r\n while True:\r\n data = await websocket.receive_text()\r\n await websocket.send_text(f\"You wrote: {data}\" )\r\n for clientid in websockets:\r\n if client_id!=clientid:\r\n await websockets[clientid].send_text(f\"Client #{client_id} says: {data}\")\r\n \r\n except WebSocketDisconnect:\r\n websockets.remove(websocket)\r\n for connection in websockets:\r\n await connection.send_text(f\"Client #{client_id} left the chat\")\r\n \r\n```\r\n\r\nhome.html:\r\n\r\n```html\r\n<!DOCTYPE html>\r\n<html>\r\n\r\n<head>\r\n <meta charset=\"utf-8\">\r\n <title>FastApi MVC Framework</title>\r\n <link rel=\"stylesheet\" href=\"home.css\" />\r\n\r\n</head>\r\n\r\n<body>\r\n <header style=\"text-align:left;display: flex;\">\r\n <h1>Python</h1>\r\n <h4>on FastApi</h4>\r\n\r\n </header>\r\n <nav>\r\n {% for item in routers_map %} {% if 'GET' in routers_map[item]['methods'] %} {% if routers_map[item]['auth']=='none' or request.session['user'] %}\r\n <a href=\"{{routers_map[item]['path']}}\">{{routers_map[item]['doc']\r\n and routers_map[item]['doc']['title'] or item}}</a> {% endif %} {% endif %} {% endfor %}\r\n\r\n <a href=\"#\">About</a>\r\n <a href=\"#\">Contact</a> {% if request.session['user'] %}\r\n <a href=\"/user/logout\"><b>{{request.session['user']['username']}}</b>\r\n Logout</a> {% endif %}\r\n </nav>\r\n <section>\r\n <h2>Welcome to my website</h2>\r\n <p>This is an example of a responsive design that works well on both desktop and mobile devices.</p>\r\n <p>here is the `text` variable in class method:{{text}}</p>\r\n <p style=\"color:red\"><b>{{flash}}</b></p>\r\n </section>\r\n <footer>\r\n <p>© 2023 My Website</p>\r\n </footer>\r\n</body>\r\n\r\n</html>\r\n```\r\n\r\nyour project directory structrue like this:\r\n```dir\r\n\r\n\\APP\r\n| __init__.py\r\n|\r\n+---controllers\r\n| | test_controller.py\r\n| | __init__.py\r\n| |\r\n+---models\r\n| | models.py\r\n| | __init__.py\r\n| |\r\n+---services\r\n| | user_service.py\r\n| | __init__.py\r\n| |\r\n+---tests\r\n| | test_test.py\r\n| |\r\n+---views\r\n| +---abc\r\n| | \\---2.0\r\n| | css.css\r\n| | home.html\r\n| |\r\n| +---test\r\n| | chatgpt.css\r\n| | chatgpt.html\r\n| | chatgpt.js\r\n| | home.html\r\n| | home.js\r\n| | login.html\r\n| |\r\n| \\---ws\r\n| ws_home.html\r\n|\r\n\r\n\r\n```\r\n",
"bugtrack_url": null,
"license": "Apache License 2.0",
"summary": "Simple and elegant use of FastApi in MVC mode",
"version": "1.2.4",
"split_keywords": [
"web framework",
"mvc framework",
"fastapi framework"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "77eefd0213a000ee1849d5b8caf982de4607f2bbbc84556b5a0c14bbb8299e51",
"md5": "4587fe340e4bca7b42c5f5e33210848c",
"sha256": "d76d0e84e78496920e597708a528c9fbe1cd5d5f6cf7f1fc965a167a8de05f81"
},
"downloads": -1,
"filename": "fastapi_mvc_framework-1.2.4-py3-none-any.whl",
"has_sig": false,
"md5_digest": "4587fe340e4bca7b42c5f5e33210848c",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.6",
"size": 32074,
"upload_time": "2023-04-22T11:28:11",
"upload_time_iso_8601": "2023-04-22T11:28:11.207139Z",
"url": "https://files.pythonhosted.org/packages/77/ee/fd0213a000ee1849d5b8caf982de4607f2bbbc84556b5a0c14bbb8299e51/fastapi_mvc_framework-1.2.4-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "0a16a6b3e6173f6fcabcd3597ed4877a2042ed73bd8527d7775ae661e9e4aa1e",
"md5": "af29d2e9509b949b944826d257e592a4",
"sha256": "2924eca274e818b4fe210e5f9cdefc45fbc4b251cec1890c38281e42b61b89f5"
},
"downloads": -1,
"filename": "fastapi_mvc_framework-1.2.4.tar.gz",
"has_sig": false,
"md5_digest": "af29d2e9509b949b944826d257e592a4",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.6",
"size": 29978,
"upload_time": "2023-04-22T11:28:13",
"upload_time_iso_8601": "2023-04-22T11:28:13.108507Z",
"url": "https://files.pythonhosted.org/packages/0a/16/a6b3e6173f6fcabcd3597ed4877a2042ed73bd8527d7775ae661e9e4aa1e/fastapi_mvc_framework-1.2.4.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-04-22 11:28:13",
"github": true,
"gitlab": false,
"bitbucket": false,
"github_user": "smjkzsl",
"github_project": "fastapi_framework",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"requirements": [],
"lcname": "fastapi-mvc-framework"
}