只是另一个简化flask应用程序开发的Web框架
Jawf的Python项目详细描述
下颌骨
只是另一个Web框架-简化flask应用程序开发
设置
$git clone https://github.com/codemation/Jawf.git
$ sudo ./setup.py install
$ jawf --help
基本用途
初始化JAWF项目目录
^{pr2}$将应用程序添加到项目
Usage: jawf --add-app <app-name> [--route <urlpattern> default: /app-name]
$ jawf --add-app myfirstapp
$ jawf --add-app homepage --route /
$ jawf --add-app myfirstapp
Not inside existing jawf project
--add-app
must be used within an existing project directory
or combined with --project <project-path>
$ cd Project1/
/Project1 $ jawf --add-app myfirstapp
Detected Existing project:Project1
app myfirstapp was created successfully within /home/josh/python/mysql/Project1/
这将创建一个立即连接到项目的应用程序。可以马上测试。在
/Project1$ python3 server.py
* Serving Flask app "server" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: on
* Running on http://0.0.0.0:8080/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 144-714-176
$ curl http://0.0.0.0:8080/myfirstapp
<h1>Hello myfirstapp World</h1>
对创建的应用程序的框架进行更详细的观察。在
Project1/apps/myfirstapp/myfirstapp.py
# myfirstapp
def run(server):
# Add import libraries here, run only once, when server is started
@server.route('/myfirstapp')
def myfirstapp_func():
# Add repeatable logic here, run as often as endpoint is called.
print("Hello myfirstapp World")
return "<h1>Hello myfirstapp World</h1>", 200
如果您熟悉烧瓶路径,这是完全相同的。将多个端点连接到主服务器应用程序的工作已经为您完成。在
将数据库添加到项目
JAWF使得向项目添加新的数据库、表以及与[pyql]https://github.com/codemation/pyql结合访问数据变得很容易
支持的数据库类型:sqlite3、mysql
jawf --add-db <db-name> [--type mysql default: sqlite3]
jawf --add-db finance --type mysql
jawf --add-db stocks
sqlite3是一个内置的python3库,可以创建轻量级的数据库来存储/检索数据。在
sqlite3
Project1$ jawf --add-db stocks
Detected Existing project:Project1
db stocks created successfully
在添加表并启动服务器之前,这不会立即创建数据库。在
让我们看一下dbs/h5/a/dbs/h5/a文件stocks_db.py
# stocks - type sqlite3
def run(server):
import sys, os
@server.route('/stocks_attach')
def stocks_attach():
config=dict()
with open('.cmddir', 'r') as projDir:
for projectPath in projDir:
config['database'] = f'{projectPath}dbs/stocks/stocks'
#USE ENV PATH for PYQL library or /pyql/
sys.path.append('/pyql/' if os.getenv('PYQL_PATH') == None else os.getenv('PYQL_PATH'))
try:
import data, sqlite3
from . import setup
server.data['stocks'] = data.database(sqlite3.connect, **config)
setup.attach_tables(server)
return {"status": 200, "message": "stocks attached successfully"}, 200
except Exception as e:
return {"status": 200, "message": repr(e)}, 500
stocks_attach()
这里发生了什么:
与app类似,还创建了一个端点,允许应用程序开发人员控制web服务器何时尝试访问数据库 这在远程数据库或微服务部署中变得更加有用,因为数据库服务器可能没有像APP服务器一样准备就绪。在
# stocks - type sqlite3
def run(server):
import sys, os
@server.route('/stocks_attach')
def stocks_attach():
config=dict()
这里我们首先检查项目相关目录,因为这对于sqlite3数据库非常重要,因为sqlite3数据库总是在服务器中本地存在。 默认情况下,mysqlite数据库将存在于dbs/Db name/Db中
with open('.cmddir', 'r') as projDir:
for projectPath in projDir:
config['database'] = f'{projectPath}dbs/stocks/stocks'
PYQL是一个依赖项。如果不是直接安装intavenv,可以使用环境变量PYQL_PATH或default/PYQL/system PATH来访问它。在
#USE ENV PATH for PYQL library or /pyql/
sys.path.append('/pyql/' if os.getenv('PYQL_PATH') == None else os.getenv('PYQL_PATH'))
最后,导入PYQL库,并将DB connector附加到服务器对象(在所有JAWF应用程序中都可用),然后附加表,并在不存在的情况下进行配置。在
try:
import data, sqlite3
from . import setup
server.data['stocks'] = data.database(sqlite3.connect, **config)
setup.attach_tables(server)
return {"status": 200, "message": "stocks attached successfully"}, 200
except Exception as e:
return {"status": 200, "message": repr(e)}, 500
mysql
Project1$$ jawf --add-db trades --type mysql
Detected Existing project:Project1
db trades created successfully
数据库必须已经在mysql实例中创建,并且要有访问数据库、创建表的适当用户/权限。在
trades.py
# trades - type mysql
def run(server):
import sys, os
@server.route('/trades_attach')
def trades_attach():
config=dict()
env = ['DB_USER','DB_PASSWORD','DB_HOST', 'DB_PORT']
conf = ['user','password','database','host','port']
try:
config = {cnfVal: os.getenv(dbVal).rstrip() for dbVal,cnfVal in zip(env,conf)}
except Exception as e:
print('Missing an environment variable')
config= {cnfVal: os.getenv(dbVal) for dbVal,cnfVal in zip(env,conf)}
print(config)
return {
"status": 500,
"message": "Missing environment variable(s)",
"env-vars": config
}, 500
#USE ENV PATH for PYQL library or /pyql/
sys.path.append('/pyql/' if os.getenv('PYQL_PATH') == None else os.getenv('PYQL_PATH'))
try:
import data, mysql
from . import setup
server.data['trades'] = data.database(mysql.connector.connect, **config)
setup.attach_tables(server)
return {"status": 200, "message": "trades attached successfully"}, 200
except Exception as e:
return {"status": 200, "message": repr(e)}, 500
trades_attach()
大部分相同的逻辑与SQLITE3数据库共享,但最重要的不同是DB连接器要求。由于这并不总是本地存在的数据库(可能是这样),我们需要了解有关如何访问数据库的更多详细信息。在
这里我们正在寻找4个不同的环境变量。可以通过多种不同的方式设置这些值,或者通过POST请求传递到/DB_NAME_attach端点,为“user”、“password”、“database”、“host”和“port”传入JSON键值对
env = ['DB_USER','DB_PASSWORD','DB_HOST', 'DB_PORT', DB_NAME]
conf = ['user','password','host','port', database]
try:
config = {cnfVal: os.getenv(dbVal).rstrip() for dbVal,cnfVal in zip(env,conf)}
except Exception as e:
print('Missing an environment variable')
config= {cnfVal: os.getenv(dbVal) for dbVal,cnfVal in zip(env,conf)}
print(config)
return {
"status": 500,
"message": "Missing environment variable(s)",
"env-vars": config
}, 500
向数据库添加表
数据库由表组成,因此我们需要为JAWF项目创建的每个表配置模式。PYQL将自动发现已经存在并且可以通过服务器数据['databaseName'].表['tableName']
jawf --add-db-table <db-name> --table <table-name>
jawf --add-db-table finance --table purchaseOrders
$ jawf --add-db-table trades --table daytrades
Detected Existing project:Project1
table daytrades config created within db trades
这将在trades数据库的tables dir中创建一个daytrades表。在
def db_attach(server):
db = server.data['trades']
# Example
# db.create_table(
# 'users', # table-name
# [
# ('userid', int, 'AUTOINCREMENT'),
# ('username', str, 'UNIQUE NOT NULL'),
# ('email', str, 'NOT NULL'),
# ('join_date', str),
# ('last_login', str),
# ],
# 'userid' # Primary Key
# )
#UNCOMMENT Below to create
#
#db.create_table(
# 'daytrades', [
# (),
# (),
# ()
#)
pass # Enter db.create_table statement here
有关表模式用法的更多信息,请参阅PYQL文档,但是上面的模板让您开始使用。在
- 项目
标签: