Flask的开始

Flask介绍

框架:对于同一类型的项目共性代码的封装,称为框架。

Flask 是python开发编写的web框架,相较其他框架,Flask更加的轻量,灵活,但是对python代码能力要求高,Flask只提供了最基本web功能,其他功能都需要开发者自己使用python代码实现,所以,Flask项目质量是由开发者的能力决定的,但是,随着版本迭代,好多社区,组织,三方开发出了公共的Flask插件,开发者不再需要编写好多功能,转为,下载,安装使用三方插件。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WH4GM6YL-1605959492028)(G:\Python\typora\图片\image-20201121111259218.png)]

Flask的开始

下载

python=3.7 python的版本

flask=1.1.1 flask的版本

  1. 打开cmd

    国内镜像源的地址:
    清华大学:https://pypi.tuna.tsinghua.edu.cn/simple
    阿里云:http://mirrors.aliyun.com/pypi/simple/
    豆瓣:http://pypi.douban.com/simple/
    
    pip install flask=1.1.1 -i https://pypi.tuna.tsinghua.edu.cn/simple  # 使用清华源
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7y1q4swU-1605959492031)(G:\Python\typora\图片\image-20201121111751361.png)]

使用flask编写helloword

  1. 配置pycharm

    1. 选择file里面的setting,下面的project:项目名,Project Interpreter

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-46HnGG88-1605959492033)(G:\Python\typora\图片\image-20201121111956698.png)]

    ​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NS8s0mzZ-1605959492036)(G:\Python\typora\图片\image-20201121112230875.png)]

    ​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ndHmyA6r-1605959492038)(G:\Python\typora\图片\image-20201121112258022.png)]

    1. 找到自己创建的沙箱环境的python解释器

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mBNqfjLX-1605959492040)(G:\Python\typora\图片\image-20201121112342200.png)]

    1. 编写代码

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NWk3XxS9-1605959492041)(G:\Python\typora\图片\image-20201121112705682.png)]

    2. flask实现的原理

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-56BCFlhY-1605959492043)(G:\Python\typora\图片\image-20201121112750327.png)]

    3. 代码解析

      main.py

      from flask import Flask
      
      app = Flask(__name__) #创建web服务器实例
      #__name__: 内置的python方法,用来标识python文件的执行状态
          #直接执行当前文件  __name__ = '__main__'
          #被导入执行  __name__ = "文件的相对路径"
          #执行的优先级
      
      #用户通过url来告诉浏览器取哪里获取资源,url(统一资源定位符)
      @app.route("/index") #装饰器,用来指定路由 ,基于当前web服务器实例创建路由和对应的视图
      def index(): #视图函数
          return "<p style= 'color: red'>hello world</p>"
      
      @app.route("/hello") #装饰器,用来指定路由
      def hello():
          return "<h1 style= 'color: red'>hello world</h1>"
      
      
      if __name__ == '__main__':
          #通常网站的页面需要放到服务器上,用户无法直接双击打开页面,
          #所以有网站服务器的概念:
          # apache(比较老,比较成熟web服务器 LAMP(Linux Apache Mysql PHP))
          # nginx (比较新,比较成熟web服务器 LNMP(Linux nginx Mysql PHP))
          # python自带轻量级web服务器,在学习之初直接使用。
          # app.run() #启动服务器
          app.run(host="10.10.18.74",port=8000,debug=True)
              #host 主机
              #post 端口
              #debug 调试
      
  2. 代码编写的步骤

    1. 导入flask模块:form flask import Flask

    2. 创建一个服务器实例:app = Flask(_name_)

    3. 指定路由:@app.route("/路由")

      • 路由:是指向视图函数的的标志,用户通过url访问,服务器会从url中获取路由.

      • url(统一资源定位符):比如:https://image1.ljcdn.com/usercenter/images/uc_ehr_avatar/92479a95-3fcb-479c-acfa-643b2b147e53.jpg.120x160.jpg

        • 协议头: https://
        • 主机部分: image1.ljcdn.com(也可以是一个ip:端口地址如:127.0.0.1:8000)
          • 端口:每个ip都有0-65535给端口,前1000个用于系统服务,比如:http协议是80端口,https协议是443,mysql:3306,每个ip的对应端口同时支持一个服务.
        • 路由部分:
          • 代表资源在这个服务器的位置
          • 对于视图函数,代表视图函数的路由
          • 对于静态资源代表放在服务器当前web服务的根目录的位置。
            • usercenter/images/uc_ehr_avatar/92479a95-3fcb-479c-acfa-643b2b147e53.jpg.120x160.jpg
          • 根目录:网络服务器启动的目录就是根目录
    4. 编写视图函数

      视图函数:一个实现功能的函数,它接收Web请求并返回Web响应

    5. 启动web服务器,实质上就是在服务器指定目录下,启动服务,将这个目录作为根目录按照http协议规则解析给用户。

      app.run() # 启动服务器

      ​ host:设置服务器的ip

      ​ port:服务器的端口

      ​ debug:调试模式

    6. 执行的步骤

      1. 启动脚本
      2. 在浏览器上给定url(ip:端口/路由)

flask路由操作

在web开发当中,可以通过路由修改查询的内容,因为路由本身就可以把接收的数据当中的一部分传递给视图函数。

@app.route("/hello/<name>/")
def hello(name):
    result = "<h1>hello world,I am {}</h1>".format(name)
    return result
@app.route("/say_hello/")
def say_hello():
    result = """
    <ul>
        <li><a href="/hello/老王/">老王</a></li>
        <li><a href="/hello/老李/">老李</a></li>
        <li><a href="/hello/老张/">老张</a></li>
        <li><a href="/hello/老赵/">老赵</a></li>
    </ul>
    """
    return result
  1. 在路由上,有<>包围的部分,匹配到的内容会作为参数传递给视图函数
  2. 视图函数需要有和路由<>内名称对应的形参进行参数接收
  3. 接收到的参数可以在函数内部使用
  4. 可以通过页面的<a>标签的href属性指向目的路由去跳转页面

路由给实际上给参数的类型也做了划分

类型描述
string匹配字符串内容,也是默认类型
int匹配整数类型
float匹配小数类型
path匹配路径
@app.route("/hello/<path:name>/")
def hello(name):
    result_dict = {
        "老王": {"like": "吃"},
        "老李": {"like": "喝"},
        "老张": {"like": "睡"},
        "老赵": {"like": "跑"},
    }
    like = result_dict.get(name)
    if like:
        like = like.get("like")
    result = "<h1>{} 的爱好是 {}</h1>".format(name,like)
    return result

jimjia2模板技术

jinjia2模板技术来源与django的模板技术,但目前发展超过了django的模板系统。

jinjia2 负责以下任务:

加载HTML

  1. 在main文件同级目录创建templates目录

  2. 在目录当中编写HTML文件

  3. 导入render_template方法

  4. 使用render_template方法加载HTML文件

  5. 将加载的内容返回

    from flask import Flask
    from flask import render_template
    app = Flask(__name__)
    
    #web后端把HTML文件认为是模板文件,
    #Flask 默认查找当前目录下templates目录中的HTML
    
    @app.route("/")
    def index():
        return render_template("index.html")
    
    
    if __name__ == '__main__':
        app.run(
            host = "0.0.0.0",
            port = 80,
            debug = True
        )
    

HTML数据渲染

就是将python视图函数中的数据传递到HTML中去

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q0xF0nEQ-1605959492045)(G:\Python\typora\图片\image-20201121191224633.png)]

前端展示的效果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UM2wZAO6-1605959492046)(G:\Python\typora\图片\image-20201121191249222.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PMjgKYnp-1605959492048)(G:\Python\typora\图片\image-20201121192532345.png)]

jinja2不但可以将数据传递到前端页面上,还具备一套完整的前端渲染方法。

总体,jinja2将模板语法分为三类

语法描述
{{ }}变量
{% %}标签
{{ | }}过滤器

变量可以接收视图函数传递过来的对象,并且调用他们的方法

标签具备一部分python的语法,可以实现加强的效果

循环 for

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <!--
    <h1>这个是一个纯粹的HTML</h1>
    <h1>{{ name }} {{ age }}</h1>
    <h1>{{ project.upper() }}</h1>
    <h1>{{ project.split('p') }}</h1>
    -->
    {{ name_list }}
    <ul>
        {% for i in name_list %}
        <li><a href="{{ i }}">{{ i }}</a></li>
        {% endfor %}
    </ul>
</body>
</html>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9D4P9M5i-1605959492050)(G:\Python\typora\图片\image-20201121194314343.png)]

@app.route("/book_list/")
def book_list():
    book_list = [
        {"book_name": "", "book_type": "", "author": "", "public":""},
        {"book_name": "", "book_type": "", "author": "", "public": ""},
        {"book_name": "", "book_type": "", "author": "", "public": ""},
        {"book_name": "", "book_type": "", "author": "", "public": ""},
        {"book_name": "", "book_type": "", "author": "", "public": ""},
    ]
    return render_template("index.html",**locals())

图书案例

  • 前端部分

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <table width="700px">
            <tr>
               <th>书名</th>
               <th>作者</th>
               <th>出版社</th>
               <th>类型</th>
            </tr>
            {% for book in books %}
            <tr align="center" height="30px">
                <td>{{ book.book_name }}</td>
                <td>{{ book.author }}</td>
                <td>{{ book.public }}</td>
                <td>{{ book.book_type }}</td>
            </tr>
            {% endfor %}
        </table>
    </body>
    </html>
    
  • 后端部分

    from flask import Flask
    from flask import render_template
    app = Flask(__name__)
    
    @app.route("/book_list/")
    def book_list():
        books = [
            {"book_name": "《西游记》", "book_type": "必读", "author": "朋朋", "public":"延边出版社"},
            {"book_name": "《奥特曼大战小矮人》", "book_type": "选读", "author": "森森", "public": "新华出版社"},
            {"book_name": "《卖火柴的葫芦娃》", "book_type": "必读", "author": "迅迅", "public": "西安交大出版社"},
            {"book_name": "《天线宝宝》", "book_type": "选读", "author": "安安", "public": "清华大学出版社"},
            {"book_name": "《桃花怪大战菊花侠》", "book_type": "必读", "author": "框框", "public": "中公出版社"}
        ]
        return render_template("book_list.html",**locals())
    
    if __name__ == '__main__':
        app.run(
            host = "0.0.0.0",
            port = 80,
            debug = True
        )
    

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 9
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值