只是另一个简化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文档,但是上面的模板让您开始使用。在

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何拆分字符串(基于各种分隔符),但不保留空格?   解析。Json格式的txt文件和knime中的java   java Spring rest api为什么在rest api调用的响应中更改了数据类型   升华文本3抛出java。lang.ClassNotFoundException,而记事本++不存在   java Android指纹扫描仪在尝试5次后停止工作?   java Android如何设置精确的重复报警?   java如何使用HTTPGET connect为access API输入用户名和密码   java当测试报告显示没有测试失败时,Gradle为什么说“有失败的测试”?   用Gson实现java获取响应   MapReduce程序中函数错误的java不可映射参数   java spring安全性不符合自动代理的条件   java GWT使用异步回调进行同步/阻塞调用   java奇怪的类数组问题无法在jsp中显示   如何在java中使用PrinterJob使用epl打印条形码   java如何在JTable中居中单元格   将Java Mockito测试转换为Kotlin   html Java正则表达式模式匹配到多个相同标记   testCompile中缺少java Gradle(Android)多项目依赖项   在输入提示后输入字符串时发生java FileNotFoundException