精华内容
下载资源
问答
  • 关于:BlackWidow是基于pythonWeb应用程序蜘蛛,用于从目标网站收集子域,URL,动态参数,电子邮件地址和电话号码。 该项目还包括Inject-X模糊器以扫描动态URL关于:BlackWidow是基于pythonWeb应用程序蜘蛛,...
  • python web框架 如果您正在使用Python开发Web应用程序,则很可能会利用框架。 框架 “通过提供可重复使用的代码或常见操作的扩展,“是一个代码库,可在构建可靠,可伸缩且可维护的Web应用程序时使开发人员的工作...

    python web框架

    如果您正在使用Python开发Web应用程序,则很可能会利用框架。 框架 “通过提供可重复使用的代码或常见操作的扩展,“是一个代码库,可在构建可靠,可伸缩且可维护的Web应用程序时使开发人员的工作更加轻松”。 有许多适用于Python的框架,包括FlaskTornadoPyramidDjango 新的Python开发人员经常会问:应该使用哪个框架?

    • 该网站的新访问者应该能够注册新帐户。
    • 注册用户可以登录,注销,查看其个人资料信息以及编辑其信息。
    • 注册用户可以创建新任务项,查看其现有任务以及编辑现有任务。

    所有这些都完善了每个后端必须实现的一组紧凑的API端点以及允许的HTTP方法:

    • GET /
    • POST /accounts
    • POST /accounts/login
    • GET /accounts/logout
    • GET, PUT, DELETE /accounts/<str : username>
    • GET, POST /accounts/<str : username>/tasks
    • GET, PUT, DELETE /accounts/<str : username>/tasks/<int : id>

    每个框架都有不同的方式来组合其路由,模型,视图,数据库交互以及整个应用程序配置。 我将从Flask开始描述本系列中每个框架的那些方面。

    烧瓶启动和配置

    与最广泛使用的Python库一样,可从Python包索引 (PPI)安装Flask包。 首先创建一个工作目录(例如flask_todo是一个很好的目录名称),然后安装flask软件包。 您还将需要安装flask-sqlalchemy以便Flask应用程序具有与SQL数据库进行通讯的简单方法。

    我喜欢在Python 3虚拟环境中进行此类工作。 要到达那里,请在命令行上输入以下内容:

    
    
    $ mkdir flask_todo
    $ cd flask_todo
    $ pipenv install --python 3.6
    $ pipenv shell
    ( flask-someHash ) $ pipenv install flask flask-sqlalchemy

    如果要将其转换为Git存储库,这是运行git init的好地方。 这将是项目的根,如果您要将代码库导出到另一台计算机,则在这里拥有所有必要的安装文件将很有帮助。

    迁移的一个好方法是将代码库转换为可安装的Python发行版。 在项目的根目录下,创建setup.py和一个名为todo的目录,以保存源代码。

    setup.py应该看起来像这样:

    
    
    from setuptools import setup , find_packages

    requires = [
        'flask' ,
        'flask-sqlalchemy' ,
        'psycopg2' ,
    ]

    setup (
        name = 'flask_todo' ,
        version = '0.0' ,
        description = 'A To-Do List built with Flask' ,
        author = '<Your actual name here>' ,
        author_email = '<Your actual e-mail address here>' ,
        keywords = 'web flask' ,
        packages = find_packages ( ) ,
        include_package_data = True ,
        install_requires = requires
    )

    这样,无论何时要安装或部署项目,都将在requires列表中包含所有必需的软件包。 您还将拥有在site-packages设置和安装软件包所需的一切。 有关如何编写可安装的Python发行版的更多信息,请查看setup.py上的文档

    在包含您的源代码的todo目录中,创建一个app.py文件和一个空白的__init__.py文件。 __init__.py文件允许您从todo导入,就好像它是已安装的软件包一样。 app.py文件将是应用程序的根目录。 这是Flask应用程序的全部优点所在,您将创建一个指向该文件的环境变量。 如果您正在使用pipenv (就像我一样),则可以使用pipenv --venv查找虚拟环境,并在环境的activate脚本中设置该环境变量。

    
    
    # in your activate script, probably at the bottom (but anywhere will do)

    export FLASK_APP = $VIRTUAL_ENV/../todo/app. py
    export DEBUG = 'True'

    安装Flask ,还安装了flask命令行脚本。 键入flask run会提示虚拟环境的Flask软件包在FLASK_APP环境变量指向的任何脚本中使用app对象运行HTTP服务器。 上面的脚本还包含一个名为DEBUG的环境变量,稍后将使用它。

    让我们谈谈这个app对象。

    todo/app.py ,您将创建一个app对象,它是Flask对象的一个​​实例。 它将充当整个应用程序的中央配置对象。 它用于设置扩展功能所需的应用程序片段,例如数据库连接和身份验证帮助。

    它通常用于设置路由,这些路由将成为应用程序的交互点。 为了解释这意味着什么,让我们看一下它对应的代码。

    
    
    from flask import Flask

    app = Flask ( __name__ )

    @ app. route ( '/' )
    def hello_world ( ) :
        """Print 'Hello, world!' as the response body."""
        return 'Hello, world!'

    这是最基本的完整Flask应用程序。 appFlask的实例,采用脚本文件的__name__ 这使Python知道如何从与此文件相关的文件中导入。 app.route装饰器装饰第一个视图函数; 它可以指定用于访问应用程序的路由之一。 (我们待会再看。)

    您指定的任何视图都必须由app.route装饰,才能成为应用程序的功能部分。 您可以在整个应用程序中分散任意数量的功能,但是为了使该功能可以从应用程序外部的任何内容访问,您必须修饰该功能并指定使其进入视图的路径。

    在上面的示例中,当应用程序运行并通过http://domainname/访问时,用户将收到"Hello, World!" 作为回应。

    在Flask中连接数据库

    尽管上面的代码示例代表了完整的Flask应用程序,但它并没有做任何有趣的事情。 Web应用程序可以做的一件有趣的事情是持久存储用户数据,但是它需要数据库的帮助和连接。

    Flask非常是一个“自己动手”的网络框架。 这意味着没有内置的数据库交互,但是flask-sqlalchemy软件包会将SQL数据库连接到Flask应用程序。 flask-sqlalchemy软件包只需一件事即可连接到SQL数据库:数据库URL。

    注意,只要DBMS的中介程序遵循DBAPI-2标准 ,各种各样SQL数据库管理系统都可以与flask-sqlalchemy sqlalchemy一起使用 在此示例中,我将使用PostgreSQL(主要是因为我已经使用了很多),所以与Postgres数据库对话的中介是psycopg2软件包。 确保在您的环境中安装了psycopg2并将其包含在setup.py所需软件包的列表中。 您无需为此做任何其他事情; flask-sqlalchemy将从数据库URL识别Postgres。

    Flask需要通过SQLALCHEMY_DATABASE_URI属性将数据库URL作为其中央配置的SQLALCHEMY_DATABASE_URI 一种快速而肮脏的解决方案是将数据库URL硬编码到应用程序中。

    
    
    # top of app.py
    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy

    app = Flask ( __name__ )
    app. config [ 'SQLALCHEMY_DATABASE_URI' ] = 'postgres://localhost:5432/flask_todo'
    db = SQLAlchemy ( app )

    但是,这不是一个可持续的解决方案。 如果您更改数据库或不希望数据库URL在源代码管理中可见,则必须采取额外的步骤来确保您的信息适合于环境。

    您可以使用环境变量来简化事情。 他们将确保,无论代码在什么计算机上运行,​​只要在运行环境中配置了正确的东西,它便始终指向正确的东西。 它还确保即使您需要该信息来运行应用程序,该信息也不会在源代码控制中显示为硬编码值。

    在声明FLASK_APP的同一位置,声明一个指向Postgres数据库位置的DATABASE_URL 开发倾向于在本地进行,因此只需指向您的本地数据库即可。

    
    
    # also in your activate script

    export DATABASE_URL = 'postgres://localhost:5432/flask_todo'

    现在在app.py ,在应用程序配置中包括数据库URL。

    
    
    app. config [ 'SQLALCHEMY_DATABASE_URI' ] = os . environ . get ( 'DATABASE_URL' , '' )
    db = SQLAlchemy ( app )

    就像这样,您的应用程序具有数据库连接!

    在Flask中定义对象

    与数据库对话是一个很好的第一步。 现在是时候定义一些对象来填充该数据库了。

    在应用程序开发中,“模型”是指某些实际或概念性对象的数据表示。 例如,如果要为汽车经销商构建应用程序,则可以定义一个Car模型,该模型封装了汽车的所有属性和行为。

    在这种情况下,您要使用任务构建任务列表,并且每个任务都属于一个用户。 在深入思考它们之间的关系之前,请先为“任务”和“用户”定义对象。

    flask-sqlalchemy软件包利用SQLAlchemy设置并通知数据库结构。 您将通过继承db.Model对象来定义将存在于数据库中的模型,并将这些模型的属性定义为db.Column实例。 对于每一列,您必须指定一种数据类型,以便将该数据类型作为第一个参数传递到对db.Column的调用中。

    由于模型定义与应用程序配置所占用的概念空间不同,因此请使models.py将模型定义与app.py分开app.py Task模型应构造为具有以下属性:

    • id :一个值,是要从数据库中提取的唯一标识符
    • name :列出任务时用户将看到的任务的名称或标题
    • note :一个人可能要在任务中留下的任何其他注释
    • creation_date :创建任务的日期和时间
    • due_date :任务应完成的日期和时间(如果有的话)
    • completed :指示任务是否已完成的方法

    给定Task对象的此属性列表,可以如下定义应用程序的Task对象:

    
    
    from . app import db
    from datetime import datetime

    class Task ( db. Model ) :
        """Tasks for the To Do list."""
        id = db. Column ( db. Integer , primary_key = True )
        name = db. Column ( db. Unicode , nullable = False )
        note = db. Column ( db. Unicode )
        creation_date = db. Column ( db. DateTime , nullable = False )
        due_date = db. Column ( db. DateTime )
        completed = db. Column ( db. Boolean , default = False )

        def __init__ ( self , *args , **kwargs ) :
            """On construction, set date of creation."""
            super ( ) . __init__ ( *args , **kwargs )
            self . creation_date = datetime . now ( )

    注意类构造函数方法的扩展。 归根结底,您构造的任何模型仍然是Python对象,因此必须进行构造才能实例化。 确保模型实例的创建日期能够反映其实际创建日期非常重要。 您可以通过有效地说“在构造此模型的实例时,记录日期和时间并将其设置为创建日期”来显式设置该关系。

    模型关系

    在给定的Web应用程序中,您可能希望能够表达对象之间的关系。 在“待办事项列表”示例中,用户拥有多个任务,而每个任务仅由一个用户拥有。 这是“多对一”关系(也称为外键关系)的示例,其中任务是“许多”,而拥有这些任务的用户是“一个”。

    在Flask中,可以使用db.relationship函数指定db.relationship关系。 首先,构建User对象。

    
    
    class User ( db. Model ) :
        """The User object that owns tasks."""
        id = db. Column ( db. Integer , primary_key = True )
        username = db. Column ( db. Unicode , nullable = False )
        email = db. Column ( db. Unicode , nullable = False )
        password = db. Column ( db. Unicode , nullable = False )
        date_joined = db. Column ( db. DateTime , nullable = False )
        token = db. Column ( db. Unicode , nullable = False )

        def __init__ ( self , *args , **kwargs ) :
            """On construction, set date of creation."""
            super ( ) . __init__ ( *args , **kwargs )
            self . date_joined = datetime . now ( )
            self . token = secrets. token_urlsafe ( 64 )

    它看起来与Task对象非常相似; 您会发现大多数对象的类属性基本格式与表列相同。 每隔一段时间,您会遇到一些不同的东西,包括一些多重继承魔术,但这是常态。

    现在已经创建了User模型,您可以设置外键关系。 对于“许多”,为拥有该任务的Useruser_id以及具有该ID的user对象设置字段。 还要确保包含一个关键字参数( back_populates ),以在任务使用户成为所有者时更新User模型。

    对于“一个”,为特定用户拥有的tasks设置一个字段。 与维护Task对象上的双向关系类似,在“用户的关系”字段上设置关键字参数以在将Task分配给用户时更新Task。

    
    
    # on the Task object
    user_id = db. Column ( db. Integer , db. ForeignKey ( 'user.id' ) , nullable = False )
    user = db. relationship ( "user" , back_populates = "tasks" )

    # on the User object
    tasks = db. relationship ( "Task" , back_populates = "user" )

    初始化数据库

    现在已经设置了模型和模型关系,开始设置数据库。 Flask没有附带自己的数据库管理实用程序,因此您必须(在某种程度上)编写自己的数据库。 您不必花哨的时间; 您只需要一些东西就可以识别要创建的表以及创建它们的代码(或在需要时删除它们)。 如果您需要更复杂的东西,例如处理数据库表的更新(即数据库迁移),则需要使用Flask-MigrateFlask-Alembic之类的工具。

    setup.py旁边创建一个名为initializedb.py的脚本来管理数据库。 (当然,不需要调用它,但是为什么不给出适合文件功能的名称呢?)在initializedb.py ,从app.py导入db对象,并使用它创建或删除表。 initializedb.py应该最终看起来像这样:

    
    
    from todo. app import db
    import os

    if bool ( os . environ . get ( 'DEBUG' , '' ) ) :
        db. drop_all ( )
    db. create_all ( )

    如果设置了DEBUG环境变量,则删除表并重建。 否则,只创建一次表就可以了。

    视图和URL配置

    连接整个应用程序所需的最后一位是视图和路由。 在Web开发中,“视图”(概念上)是在您的应用程序中被命中特定访问点(“路由”)时运行的功能。 这些访问点显示为URL:应用程序中功能的路径,该功能返回一些数据或处理已提供的某些数据。 这些视图将是逻辑结构,用于处理来自给定客户端的特定HTTP请求,并向该客户端返回一些HTTP响应。

    在Flask中,视图显示为函数; 例如,请参见上面的hello_world视图。 为了简单起见,这里再次是:

    
    
    @ app. route ( '/' )
    def hello_world ( ) :
        """Print 'Hello, world!' as the response body."""
        return 'Hello, world!'

    当访问http://domainname/的路由时,客户端将收到响应“ Hello,world!”。

    使用Flask,当使用app.route装饰功能时,会将其标记为视图。 反过来, app.route将从指定路由到访问该路由时运行的函数的映射添加到应用程序的中央配置。 您可以使用它来开始构建其余的API。

    从仅处理GET请求的视图开始,并以表示所有可访问路由和可用于访问它们的方法的JSON响应。

    
    
    from flask import jsonify

    @ app. route ( '/api/v1' , methods = [ "GET" ] )
    def info_view ( ) :
        """List of routes for this API."""
        output = {
            'info' : 'GET /api/v1' ,
            'register' : 'POST /api/v1/accounts' ,
            'single profile detail' : 'GET /api/v1/accounts/<username>' ,
            'edit profile' : 'PUT /api/v1/accounts/<username>' ,
            'delete profile' : 'DELETE /api/v1/accounts/<username>' ,
            'login' : 'POST /api/v1/accounts/login' ,
            'logout' : 'GET /api/v1/accounts/logout' ,
            "user's tasks" : 'GET /api/v1/accounts/<username>/tasks' ,
            "create task" : 'POST /api/v1/accounts/<username>/tasks' ,
            "task detail" : 'GET /api/v1/accounts/<username>/tasks/<id>' ,
            "task update" : 'PUT /api/v1/accounts/<username>/tasks/<id>' ,
            "delete task" : 'DELETE /api/v1/accounts/<username>/tasks/<id>'
        }
        return jsonify ( output )

    由于您希望视图处理一种特定类型的HTTP请求,因此请使用app.route添加该限制。 methods关键字参数将字符串列表作为值,每个字符串都是一种可能的HTTP方法。 实际上,您可以使用app.route来限制一种或多种HTTP请求,也可以通过不使用methods关键字参数来接受任何一种。

    无论您打算从视图函数返回什么,都必须是字符串或在构造正确格式的HTTP响应时Flask变成字符串的对象。 该规则的例外是当您尝试处理应用程序引发的重定向和例外时。 对于开发人员来说,这意味着您需要将尝试发送回客户端的任何响应封装到可以解释为字符串的内容中。

    一个包含复杂性但仍可以字符串化的良好结构是Python字典。 因此,我建议,每当要向客户端发送一些数据时,都选择一个Python dict其中包含传递信息所需的任何键值对。 要将字典转换为格式正确的JSON响应,标头和全部,请将其作为参数传递给Flask的jsonify函数( from flask import jsonify )。

    上面的view函数有效地列出了该API打算处理的每条路由,并在访问http://domainname/api/v1路由时将其发送给客户端。 请注意,Flask本身就支持路由到完全匹配的URI,因此使用尾随/来访问相同的路由会产生404错误。 如果要使用相同的视图函数来处理这两个对象,则需要像这样的堆栈装饰器:

    
    
    @ app. route ( '/api/v1' , methods = [ "GET" ] )
    @ app. route ( '/api/v1/' , methods = [ "GET" ] )
    def info_view ( ) :
        # blah blah blah more code

    一个有趣的情况是,如果所定义的路由具有尾斜杠,并且客户端要求该路由不带斜杠,则无需在装饰器上加倍。 Flask会适当地重定向客户的请求。 奇怪的是,这两种方式都不起作用。

    烧瓶请求和数据库

    Web框架的基本工作是处理传入的HTTP请求并返回HTTP响应。 除了已访问的URI之外,先前编写的视图实际上与HTTP请求没有太大关系。 它不处理任何数据。 让我们看一下需要处理数据时Flask的行为。

    首先要知道的是Flask没有为每个视图函数提供单独的request对象。 它具有每个视图函数都可以使用的一个全局请求对象,并且该对象方便地命名为request并且可以从Flask包中导入。

    接下来的事情是Flask的路线模式可能会有更多细微差别。 一种情况是硬编码路由,必须完全匹配才能激活视图功能。 另一种情况是一种路由模式,该模式可以处理一定范围的路由,通过允许该路由的一部分可变来将所有映射映射到一个视图。 如果所讨论的路由具有变量,则可以从视图的参数列表中的同名变量访问相应的值。

    
    
    @ app. route ( '/a/sample/<variable>/route)
    def some_view(variable):
        # some code blah blah blah

    要与视图中的数据库进行通信,必须使用填充到脚本顶部的db对象。 它的session属性是您要进行更改时与数据库的连接。 如果只想查询对象,则通过db.Model构建的对象可以通过query属性拥有自己的数据库交互层。

    最后,必须特意构建从视图中获取的比字符串更复杂的任何响应。 以前,您使用“ jsonified”字典构建了响应,但是做出了某些假设(例如,200个状态代码,状态消息“ OK”,“文本/纯文本”的Content-Type)。 您必须在HTTP响应中故意添加任何特殊的调味料。

    了解了有关使用Flask视图的这些事实,可以构造一个视图,其工作是创建新的Task对象。 让我们看一下下面的代码,并逐段处理它。

    
    
    from datetime import datetime
    from flask import request , Response
    from flask_sqlalchemy import SQLAlchemy
    import json

    from . models import Task , User

    app = Flask ( __name__ )
    app. config [ 'SQLALCHEMY_DATABASE_URI' ] = os . environ . get ( 'DATABASE_URL' , '' )
    db = SQLAlchemy ( app )

    INCOMING_DATE_FMT = '%d/%m/%Y %H:%M:%S'

    @ app. route ( '/api/v1/accounts/<username>/tasks' , methods = [ 'POST' ] )
    def create_task ( username ) :
        """Create a task for one user."""
        user = User. query . filter_by ( username = username ) . first ( )
        if user :
            task = Task (
                name = request. form [ 'name' ] ,
                note = request. form [ 'note' ] ,
                creation_date = datetime . now ( ) ,
                due_date = datetime . strptime ( due_date , INCOMING_DATE_FMT ) if due_date else None ,
                completed = bool ( request. form [ 'completed' ] ) ,
                user_id = user . id ,
            )
            db. session . add ( task )
            db. session . commit ( )
            output = { 'msg' : 'posted' }
            response = Response (
                mimetype = "application/json" ,
                response = json. dumps ( output ) ,
                status = 201
            )
            return response

    让我们从@app.route装饰器开始。 路由是'/api/v1/accounts/<username>/tasks' ,其中<username>是路由变量。 将尖括号放在要更改的路线的任何部分周围,然后将该路线的该部分包括在参数列表中具有相同名称的下一行中。 参数列表中唯一的参数应该是路径中的变量。

    接下来是查询:

    user = User.query.filter_by(username=username).first()

    要按用户名查找一个用户,从概念上讲,您需要查看数据库中存储的所有User对象,并找到用户名与所请求的用户名匹配的用户。 使用Flask,您可以直接通过query属性向与您的条件匹配的实例询问User对象。 这种类型的查询将提供对象列表(即使它只是一个对象或根本没有对象),因此要获取所需的对象,只需调用first()

    
    
    task = Task (
        name = request. form [ 'name' ] ,
        note = request. form [ 'note' ] ,
        creation_date = datetime . now ( ) ,
        due_date = datetime . strptime ( due_date , INCOMING_DATE_FMT ) if due_date else None ,
        completed = bool ( request. form [ 'completed' ] ) ,
        user_id = user . id ,
    )

    每当将数据发送到应用程序时,无论使用哪种HTTP方法,该数据都会存储在request对象的form属性上。 前端字段的名称将是映射到form字典中该数据的键的名称。 它总是以字符串形式出现,因此,如果您希望数据成为特定的数据类型,则必须通过将其强制转换为适当的类型来使其明确。

    要注意的另一件事是将当前用户的用户ID分配给新实例化的Task 这就是保持外键关系的方式。

    
    
    db. session . add ( task )
    db. session . commit ( )

    创建一个新的Task实例很棒,但是它的构造与数据库中的表没有固有的联系。 为了将新行插入到相应SQL表中,必须使用附加到db对象的session db.session.add(task)要添加到表中的新Task实例,但尚未添加它。 虽然此处仅完成一次,但是您可以在提交之前添加任意数量的内容。 db.session.commit()接受所有已分阶段的更改或“提交”,并将其应用于数据库中的相应表。

    
    
    output = { 'msg' : 'posted' }
    response = Response (
        mimetype = "application/json" ,
        response = json. dumps ( output ) ,
        status = 201
    )

    响应是一个Response对象的实际实例,它的mimetype ,body和status故意设置的。 该视图的目的是提醒用户他们创建了新内容。 了解此视图应如何作为发送和接收JSON的后端API的一部分,响应主体必须是JSON可序列化的。 带有简单字符串消息的字典就足够了。 通过在字典上调用json.dumps来确保已准备好进行传输,这会将您的Python对象转换为有效的JSON。 使用它代替jsonify ,因为jsonify使用其输入作为响应主体构造实际的响应对象。 相反, json.dumps仅采用给定的Python对象,并在可能的情况下将其转换为有效的JSON字符串。

    默认情况下,随Flask发送的任何响应的状态码均为200 这在大多数情况下都适用,在这种情况下,您无需尝试发送回特定的重定向级别或错误级别的消息。 由于这种情况明确地让前端知道何时创建了新项目,因此将状态代码设置为201 ,这与创建新事物相对应。

    就是这样! 这是在待办事项列表应用程序的当前设置下用于在Flask中创建新Task对象的基本视图。 可以构造类似的视图来列出,编辑和删除任务,但是此示例提供了有关如何完成任务的想法。

    大局观

    除了创建新事物的一种视图之外,应用程序还需要处理更多的事情。 虽然我没有讨论有关授权/身份验证系统,测试,数据库迁移管理,跨域资源共享等的任何内容,但是上面的详细信息应该足以为您提供开始构建自己的Flask应用程序的能力。

    PyCon Cleveland 2018上了解更多Python。

    翻译自: https://opensource.com/article/18/4/flask

    python web框架

    展开全文
  • pythonweb应用程序开发(Django框架) 1.安装Django并开启网页服务器 pip install django # 安装Django包 django-admin startproject mysite #在指定路径下新建一个mysite文件夹 我新建在默认路径下 本次...

    python的web应用程序开发(Django框架)

    1.安装Django并开启网页服务器
    pip install django # 安装Django包
    django-admin startproject mysite #在指定路径下新建一个mysite文件夹
    文件夹
    我新建在默认路径下
    本次课程只会修改其中的urls.py文件,新建一个views.py,其他文件都不会修改
    python manage.py migrate # 可以不运行,设计数据库
    运行成功后的界面
    运行成功后的界面
    多出的文件
    运行成功后多出了db.sqlite3的文件
    数据库
    用notepad打开后是这样的

    python manage.py runserver #开启网页服务器
    


    运行成功后的界面
    以上两句命令都需要在mysite文件夹下运行(通过cd进入mysite文件夹),例子如下

    C:\Users\吴悠>cd mysite
    C:\Users\吴悠\mysite>python manage.py runserver
    

    若在浏览器中访问:http://127.0.0.1:8000/ 显示It worked!则成功开启网页服务器(cmd窗口始终不能关闭)

    2.静态网页:I love python
    2.1 在mysite/mysite目录下新建views.py,该py文件内的内容如下:

    from django.http import HttpResponse
    def hello(request):
        return HttpResponse("I love Python! ^-^")
    

    2.2 修改mysite/mysite目录下urls.py为:

    from django.conf.urls import url
    from django.contrib import admin
    from mysite.views import hello
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^hello/$', hello),
    ]
    

    2.3 访问 http://127.0.0.1:8000/hello/

    3.动态网页:获取时间
    3.1 修改views.py为:

    from django.http import HttpResponse
    import datetime
    
    def hello(request):
        return HttpResponse("I love Python! ^-^")
    
    def current_datetime(request):
        now = datetime.datetime.now()
        html = "<html><body>It is now %s.</body></html>" % now
        return HttpResponse(html)
    

    3.2 修改mysite/mysite目录下urls.py为:

    from django.conf.urls import url
    from django.contrib import admin
    from mysite.views import hello,current_datetime
    urlpatterns = [
         url(r'^admin/', admin.site.urls),
         url(r'^hello/$', hello),
         url(r'^time/$', current_datetime),]
    

    3.3 访问 http://127.0.0.1:8000/time/

    4.发布网页(pythonanywhere.com
    4.1 注册(pythonanywhere.com)
    4.2 点击右上方的web进入Add a new web app
    4.4 Create new web app:选择Django,选择Python version
    4.5 创建好web app后,在该web app的页面下拉至code中的Source code,点击Go to directory
    4.6 注意!此时进入的是mysite文件夹,需再次点击左侧菜单栏的mysite,进入mysite/mysite在该页面上传views.py及urls.py(注意.py
    4.7 点击左上角的pythonanywhere图案,回到首页,重新“Open Web tab”,点击绿色的Reload
    4.8 打开Reload上方提供的网址…….pythonanwhere.com,即可

    例如:

    http://ilovemichael0804.pythonanywhere.com/time/
    http://ilovemichael0804.pythonanywhere.com/hello/
    5.模板系统
    5.1 修改views.py为:

    from django.template import Template, Context
    
    def LovePython(request):
        now = datetime.datetime.now()
        fp = open('C:\Users\Dr.He\Desktop\Courses\Python\Lecture 17 -Django\mysite\mysite\static\ILovePythonTemplate.html')
        # fp =open('/home/ilovepython666/mysite/mysite/static/ILovePythonTemplate.html')
        t = Template(fp.read())
        fp.close()
    
        html = t.render(Context({'current_date': now}))
        return HttpResponse(html)
    

    有一个需要注意的地方:本地测试时,fp为稍后创建的html文件所在路径,理论上放在任何地方都可以,上方代码中的fp需修改为自己电脑上ILovePythonTemplate.html所在地址
    #老师电脑中文件的位置
    fp = open(‘C:\Users\吴悠\Desktop\Courses\Python\Lecture 17 -Django\mysite\mysite\static\ILovePythonTemplate.html’)
    #我电脑中文件的位置
    fp = open(‘C:\Users\吴悠\mysite\mysite\static\ILovePythonTemplate.html’)
    5.2 新增ILovePythonTemplate.html文件(具体路径没关系,与views.py中fp相对应即可)

    <html>
    <head>
    </head>
    <body>
    <h1>I love python</h1>
    
    Jibo He
    {{ current_date }}
    </body>
    </html>
    

    5.3 更新urls.py为:

    from django.conf.urls import url
    from django.contrib import admin
    from mysite.views import hello,current_datetime,LovePython
    urlpatterns = [
         url(r'^admin/', admin.site.urls),
         url(r'^hello/$', hello),
         url(r'^time/$', current_datetime),
         url(r'^love/$', LovePython),]
    

    5.4 本地测试

    http://127.0.0.1:8000/love/

    5.5 发布
    在前面发布的基础上在同样的位置重新上传urls.py和views.py,覆盖之前上传的,并且上传ILovePythonTemplate.html文件

    上传前,views.py中的fp需要修改,不能是本地路径。例如:
    老师将.html文件上传到‘/home/ilovepython666/mysite/mysite/static’下
    fp =open(’/home/ilovepython666/mysite/mysite/static/ILovePythonTemplate.html’)
    我将.html文件上传到‘/home/ilovemichael0804/mysite/mysite/’下
    fp = open(’/home/ilovemichael0804/mysite/mysite/ILovePythonTemplate.html’)
    打开…….pythonanywhere.com/love/
    例如:http://ilovemichael0804.pythonanywhere.com/love/

    展开全文
  • 文字版,可转任意格式。开发基于PythonWeb应用开发实战图灵程序设计丛书。
  • Flexx是否想了解有关Flexx(更改)的最新信息? 订阅新闻事件。 ...您可以使用Flexx创建(跨平台)桌面应用程序,Web应用程序,并将应用程序导出到独立HTML文档中。 它也可以在Jupyter noteb中使用
  • 本课程从零基础开始介绍Python编程知识,介绍如何使用Python语言开发高可用,易维护的Web程序,内容主要包括Python语言基础,Python模块的构建,面向对象设计和编程知识,学习使用Django框架,Flask框架等。
  • 如果您正在使用Python开发Web应用程序,那么您可能正在利用框架。一个框架 “是一个代码库构建可靠,可扩展,可维护的Web应用程序时,使开发人员的生活更轻松”通过提供可重用的代码或常用操作的扩展。Python有许多...

    如果您正在使用Python开发Web应用程序,那么您可能正在利用框架。一个框架 “是一个代码库构建可靠,可扩展,可维护的Web应用程序时,使开发人员的生活更轻松”通过提供可重用的代码或常用操作的扩展。Python有许多框架,包括FlaskTornadoPyramidDjango。新的Python开发人员经常会问:我应该使用哪个框架?

    本系列旨在帮助开发人员通过比较这四个框架来回答这个问题。为了比较它们的功能和操作,我将逐一介绍为简单的待办事项列表Web应用程序构建API的过程。API本身相当简单:

    1. 该网站的新访问者应该能够注册新帐户。
    2. 注册用户可以登录,注销,查看其个人资料的信息,以及编辑他们的信息。
    3. 注册用户可以创建新任务项,查看其现有任务以及编辑现有任务。

    所有这些都围绕着一组紧凑的API端点,每个后端必须实现,以及允许的HTTP方法:

    • GET /
    • POST /accounts
    • POST /accounts/login
    • GET /accounts/logout
    • GET, PUT, DELETE /accounts/<str : username>
    • GET, POST /accounts/<str : username>/tasks
    • GET, PUT, DELETE /accounts/<str : username>/tasks/<int : id>

    每个框架都有不同的方式将其路由,模型,视图,数据库交互和整体应用程序配置组合在一起。我将在本系列中描述每个框架的这些方面,这些方面将从Flask开始。

    展开全文
  • Python Flask-演示Web应用程序 这是一个简单的Python Flask Web应用程序。 该应用程序提供系统信息和带有带CPU,内存,IO和进程信息的转盘的实时监控屏幕。 该应用程序设计时考虑了云原生演示和容器,目的是提供一...
  • Django_Basics 使用python Web框架Django开发演示Web应用程序
  • Django由一系列应用程序组成,让项目成为一个整体!!! 1、创建应用程序 在上一节打开的终端窗口中还运行着runserver,这边我们再打开一个新的终端窗口,并切换到manage.py所在的目录,激活虚拟环境,再执行命令...

    Django由一系列应用程序组成,让项目成为一个整体!!!

    1、创建应用程序

    在上一节打开的终端窗口中还运行着runserver,这边我们再打开一个新的终端窗口,并切换到manage.py所在的目录,激活虚拟环境,再执行命令startapp

    ll_env\Scripts\activate
    
    python manage.py startapp learning_lops
    
    dir
    
    dir learning_lops
    

    python manage.py startapp learning_lops
    让Django建立创建应用程序所需的基础设施,可以看见新增了一个文件夹learning_lops(见图一所示:)
    dir learning_lops
    查看文件夹中所含有的文件, models.py来定义我们要在应用程序中管理的数据。(见图二所示:)

    图一所示:
    在这里插入图片描述
    图二所示:
    在这里插入图片描述

    2、定义模型

    我们想想涉及到的数据,每位同学都需要在学习笔记中创建很多主题。用户输入的每个条目都与特定的主题相关,这些条目将以文本的形式显示。我们还需要存储每个条目的时间戳,以便能够告诉用户创建的时间。

    打开models.py文件,看看包含了哪些类容:

    为我们导入了models模块,还让我们创建自己的模型,如下图所示
    在这里插入图片描述

    在代码层面,模型就是一个类,包含属性和方法。

    下面是表示用户将要存储的主题的模型:

    from django.db import models
    
    class Topic(models.Model):
        """用户学习的主题"""
        text=models.CharField(max_length=200)
        date_added=models.DateTimeField(auto_now_add=True)
    
        def __str__(self):
            """返回模型的字符串表示"""
            return self.text
    

    Topic
    创建了一个Topic类,只包含两个属性text和date_added
    text=models.CharField(max_length=200)
    CharField由字符或文本组成的数据,需要存储少量的文本,如名称、标题或城市时,可使用CharField,定义CharField属性时,必须告诉Django预留多少空间,max_length=200,这边我们预留了最大空间为200字符。
    date_added=models.DateTimeField(auto_now_add=True)
    DateTimeField记录日期和时间的数据,传递了实参auto_now_add,每当用户创建主题时,这都让Django将这个属性自动设置成当前的日期和时间。

    3、激活模型

    要使用模型,必须让Django将应用程序包含到项目中。

    打开settings.py文件,显示如下:
    在这里插入图片描述
    这是一个元组,告诉Django项目是由哪些应用程序组成。
    在INSTALLED_APPS文件中修改:

    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        
        #我的应用程序
        'learning_lops',
    ]
    
    

    接下来,需要让Django修改数据库,使其能够存储与模型Topic相关的信息。
    在终端执行下面的命令:

    python manage.py makemigrations learning_lops
    

    makemigrations
    命令makemigrations 让Django确定该如何修改数据库,使其能够存储与我们定义的新模型相关联的数据。
    输出表明Django创建了一个名为0001_initial.py的迁移文件,这个文件将在数据库中为模型Topic创建一个表。

    效果如图所示:
    在这里插入图片描述
    应用这种迁移,让Django替我们修改数据库:

    python manage.py migrate
    

    效果如图所示:
    在这里插入图片描述

    总结

    每当需要修改“学习笔记”管理数据时,都采取如下三个步骤:

    1. 修改models.py
    2. 对learning_lops调用makemigrations
    3. 让Django迁移项目

    4、Django管理网站

    为应用程序定义模型时,Django提供的管理网站(admin site)让你能够轻松的处理模型。网站的管理员可使用管理网站,但普通用户不能使用。本节将建立管理网站,并通过它使用模型Topic来添加一些主题。

    4.1 创建超级用户

    python manage.py createsuperuser
    

    你执行命令createsuperuser时,Django会提醒你输入超级用户(用户名、邮箱(邮箱可以为空)、密码)
    这边我输入的:
    用户名为 ll_admin
    密码为 admin123
    在这里插入图片描述

    4.2 向管理网站注册模型

    Django自动在管理网站中添加了一些模型,如User和Group,但对于我们创建的模型,必须手工进行注册。

    Django在models.py所在的目录中创建了一个名为admin.py的文件。
    在admin.py中修改:

    from django.contrib import admin
    
    from learning_lops.models import Topic
    
    admin.site.register(Topic)
    

    from learning_lops.models import Topic
    导入我们要注册的模型Topic
    admin.site.register(Topic)
    在使用admin.site.register( )让Django通过管理网站管理我们的模型

    现在我们使用超级用户账户访问管理网站:
    http://127.0.0.1:8000/admin/

    效果图如下所示:
    输入我们的超级用户账户及密码
    在这里插入图片描述
    登录后效果图如下所示:
    在这里插入图片描述

    要确保终端窗口中运行着Django服务器

    4.3 添加主题

    1、向管理网站注册Topic后,我们来添加主题,点击add
    在这里插入图片描述
    2、输入Chess,并点击save,主题创建成功
    在这里插入图片描述
    3、在创建一个主题,这时候我们可以看见,创建了两个主题Chess和Rock Climbing
    在这里插入图片描述

    5、定义模型Entry

    要记录学到的国际象棋和攀岩知识,需要为用户可在学习笔记中添加条目定义模型。每个条目都与特定主题相关联,这种关系被称为多对一关系,即多个条目可关联到同一个主题。

    在models.py文件中添加

    class Entry(models.Model):
        """学到的有关某个主题的具体知识"""
        topic=models.ForeignKey(Topic,on_delete=models.CASCADE)
        text=models.TextField()
        date_added = models.DateTimeField(auto_now_add=True)
    
        class Meta:
            verbose_name_plural='entries'
    
        def __str__(self):
            """返回模型的字符串表示"""
            return self.text[:50]+"..."
    

    class Entry(models.Model):
    像Topic一样,Entry也继承了Django基类Model
    topic=models.ForeignKey(Topic,on_delete=models.CASCADE)
    topic是一个ForeignKey实例
    text=models.TextField()
    text是一个TextField实例,这种字段不需要长度限制
    date_added = models.DateTimeField(auto_now_add=True)
    属性date_added 让我们能够按照创建顺序呈现条目,并在每个条目旁边放置时间戳
    class Meta:
    在Entry中嵌套了Meta类,Meta存储用于管理模型的额外信息
    == return self.text[:50]+"…"==
    由于条目包含的文本可能很长,我们让Django只显示text的前50个字符

    5.2、迁移模型Entry

    由于我们添加了一个新模型,因此我们再次迁移数据库
    三步骤:
    1、修改models.py
    2、执行命令python manage.py makemigrations learning_lops
    3、再执行命令python manage.py migrate

    python manage.py makemigrations learning_lops
    
    python manage.py migrate
    

    生成了一个新的迁移文件-----0002_entry.py,它告诉Django如何修改数据库。执行命令migrate,迁移成功

    效果如图所示:
    在这里插入图片描述

    5.3、向管理网站注册Entry

    我们还需要注册模型Entry,修改admin.py文件

    from django.contrib import admin
    
    from learning_lops.models import Topic,Entry
    
    admin.site.register(Topic)
    admin.site.register(Entry)
    

    返回到 http://127.0.0.1:8000/admin/
    将看到learing_lops下列出现了Entry

    效果图如下所示:
    在这里插入图片描述
    点击add,进入你将发现多了个下拉列表,让你能够选择为哪个主题创建条目,还有一个用于输入条目的文本框。
    在这里插入图片描述
    选择Chess,并添加一个条目
    在这里插入图片描述
    返回到主条目管理页面,你会发现只显示了条目的开头部分,并不是全部文本,之前我们设置了 return self.text[:50]+"…"
    在这里插入图片描述
    继续在创建两个条目,分别创建Chess和Rock Climbing条目
    在这里插入图片描述
    在这里插入图片描述
    综上插入的三个条目,在主条目管理界面显示出来
    在这里插入图片描述

    6、Django shell

    输入一些数据后,就可以通过交互式终端会话以编程方式查看这些数据。这种环境称为Django shell,是用来测试项目以及排除其他故障的理想之地:

    python manage.py shell
    
    from learning_lops.models import Topic
    
    Topic.objects.all()
    
    

    python manage.py shell
    利用python manage.py shell启动一个python解释器,可使它来探索存储在项目数据库中的数据。
    learning_lops.models
    导入模块learning_lops.models中的模型Topic
    Topic.objects.all()
    在使用方法Topic.objects.all()来获取模型Topic的所有实例,返回的是一个列表

    如下图所示:
    在这里插入图片描述
    我们可以像遍历列表一样遍历查询表

    from learning_lops.models import Topic
    
    Topic.objects.all()
    
    topics=Topic.objects.all()
    for topic in topics:
    	print(topic.id,topic)
    
    

    将返回的值存储在topics中打印每个主题id,以及主题

    效果如下图所示:
    在这里插入图片描述
    通过对象的ID后,就可以获得该对象并查看其任何属性

    t=Topic.objects.get(id=1)
    t.text
    
    t.date_added
    

    查看Chess的属性text和date_added

    效果图如下所示:
    在这里插入图片描述
    我们可以查看与主题相关联的条目,前面我们给模型Entry定义了属性topic,这是一个ForeignKey,将条目与主题关联起来,Django能够获取与特定主题相关联的所有条目。

    t.entry_set.all()
    

    效果图如下所示:
    在这里插入图片描述

    展开全文
  • Metric是为Web应用程序开发而构建的框架,具有优雅,结构化和简单的特点。 Metric不仅提供用于Web应用程序开发的核心工具,而且还内置有用于任何目的的丰富资源,使您可以专注于自己的想法并在无后顾之忧的情况下...
  • Underwear是一个用于轻松将任何Python驱动的Web应用程序部署到一个或多个Linux服务器的库。 内衣可通过YAML模板进行配置,并负责安装软件包,配置Web / WSGI服务器以及保护服务器安全。 内衣能解决什么问题? 尽管...
  • Splinter是一个基于Python开发Web应用程序验收测试工具。Splinter是一个非常好用的工具,可以用于测试采用任意编程语言开发的Web应用程序。它可以执行和评估Javascript。它能够与表单中的文本输入框、File、Radio...
  • Threema Web Threema Web是Threema的Web客户端,Threema是在瑞士托管和开发的注重隐私的端到端加密移动Messenger。 借助Threema Web,您可以在桌面上使用Threema,而不会影响sec Threema Web Threema Web是Threema的...
  • FlaskWeb开发:基于PythonWeb应用开发实战 本书共分三部分,全面介绍如何基于Python 微框架Flask 进行Web 开发。第一部分是Flask 简介,介绍使用Flask 框架及扩展开发Web 程序的必备基础知识;第二部分则给出一个...
  • Flask Web开发:基于PythonWeb应用开发实战作者拥有25年软件开发经验,而《Flask Web开发:基于PythonWeb应用开发实战》则采用讲解与实例相结合的方式,不仅介绍了Flask安装、使用等基础知识,而且还带领读者...
  • Python提供了一组开发Web应用程序,本章节使用Django来开发一个名为“学习笔记”的项目! Django是一个Web框架——一套用于帮助开发交互式网站的工具,Django能够响应网页请求,还能够让你更轻松的读写数据库、管理...
  • Flask Web开发,基于PythonWeb应用开发实战。[美]Miguel Grinberg 著 安道 译。 本书共分三部分,全面介绍如何基于 Python 微框架 Flask 进行Web 开发。第一部分是 Flask 简介,介绍使用 Flask 框架及扩展开发Web...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,704
精华内容 1,481
关键字:

python开发web应用程序

python 订阅