zoukankan      html  css  js  c++  java
  • Flask基础(1)

    1、静态网页与动态网页

    • 静态网页:无法与服务器进行交互的网页
    • 动态网页:能够与服务器进行交互的网页

    2、WEB与服务器

    • WEB:网页(HTML,CSS,JS)
    • 服务器:硬件+软件
    1. 硬件范畴:一台主机
    2. 软件范畴:处理用户请求request并给出响应response的程序(APACHE,TOMCAT,Nginx,IIS......)

    3、框架

    向程序员隐藏了处理 HTTP 请求和响应相关的基础代码。--路由和模板

    4、Flask框架

    1. 基于python编写,依赖于Jinja2模板引擎Werkzeug WSGI服务的一个微型web框架
    2. MTV框架模式
    • M:Model,模型层,数据库建模,便于数据库交互(ORM框架,sqlalchemy)
    • T:Templates,模板层,用于处理用户显示的内容,如HTML
    • V:Views,视图层,处理用户请求并给出响应(路由和数据处理逻辑)

             3.非python的框架模式:MVC(Model,Views,Controller)

    5、搭建一个简单的web应用

    from flask import Flask
    
    # 将当前运行的主程序构建成Flask的应用,以便于接收用户请求,并给出响应
    app = Flask(__name__)
    
    
    @app.route('/')  # Flask中的路由定义,运行此py文件时,在浏览器地址栏输入http://localhost:5000/即可显示return的响应内容
    def index():
        """视图函数,必须要return一个响应对象"""
        return "<h1>this is my first app!</h1>"
    
    
    if __name__ == "__main__":
        # 启动Flask服务,默认端口5000,debug调试模式研发时使用
        app.run(debug=True,port=5050)
    

    6、路由route

    url与其对应处理函数逻辑的映射关系

    # 指定类型的带参路由
    @app.route('/page/<int:num>')  # 地址栏传参(指定int)给视图函数,'<path:param>'str,可以带/
    def show(num):
        return "<h1>这是第%d页。</h1>" % num
    
    # 多url路由
    @app.route('/')
    @app.route('/index')
    @app.route('<int:page>')
    def index(page=None):
        if page == None:
            page = 1
        return "<h1>这是第%d页。</h1>" % page
    
    #指定请求方法的路由
    @app.route('/page', methods=['GET','POST'])  # 只有[]中有的方法才能发送请求
    def show(page):
        return "<h1>这是第%s页。</h1>" % page
    

    url反向解析url_for('fun',arg1=value1,arg2=value2),返回fun()函数所对应的url

    # 指定类型的带参路由
    @app.route('/page/<int:num>')  # 地址栏传参(指定int)给视图函数,'<path:param>'str,可以带/
    def show(num):
        return "<h1>这是第%d页。</h1>" % num
    
    
    # url反向解析:通过视图函数的名称自动生成该函数的访问路径
    # 使用函数url_for('函数名','带参路由关键字传参'),还能反向解析静态文件如:url_for('statuc',filename='style.css')
    # 应用如:生成超链接从当前页面跳转到指定页面
    @app.route('/login')
    def login():
        from flask import url_for
        url = url_for('show', num=1)
        res = "<a href = '" + url + "'>"+"返回第1页"+"</a>"
        return res
    

    7、模板Templates

            模板是一个包含响应文本的文件(通常是HTML文件),该文件中允许包含“占位变量”来表示动态的内容,其具体值在请求中才能知道。“占位变量”最终会被真是值替代,模板最终也会被解析成响应的字符串,这一过程称为渲染。Flask本身没有模板功能,实际依赖于jinja2模板引擎。

            默认情况下,Flask会在项目文件夹下的templates文件夹中寻找模板。

      在视图函数中,通过return render_template(‘xxx.htm’,arg1=value1,arg2=value2)将模板渲染成字符串再响应给客户端,参数1是templates文件下的html文件,参数2-n是要传递给模板动态显示的替换变量占位符的值。

    模板中的语法

      变量:模板中的占位符,表示方式:{{变量}},视图函数中变量的类型可以传递支持python的任意数据类型(字符串,数字,列表,元组,字典,对象)。

    #Run.py
    from flask import Flask, render_template app = Flask(__name__) @app.route('/temp') def index(): # dic={ # 'title' :'我的第一个模板', # 'book' :'Python3', # 'author' : 'Lennie', # 'price' : 32.5, # 'publisher' : '小朋友出版社' # } # return render_template('01_temp.html', params=dic) title = '我的第一个模板' book = 'Python3' author = 'Lennie' price = 32.5 publisher = '小朋友出版社' return render_template('01_temp.html', params=locals()) if __name__ == '__main__': app.run(debug=True)

      在项目文件夹下建议个文件夹叫templates(必须是这个名字,否则要改配置),再在templates下件一个动态HTML:01_temp.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>{{params.title}}</title>
    </head>
    <body>
    <h2>书名:《{{params.book}}》</h2>
    <h2>作者:{{params.author}}</h2>
    <h2>价格:{{params.price}}</h2>
    <h2>出版社:{{params.publisher}}</h2>
    </body>
    </html>
    

      运行Run.py,浏览器访问http://localhost:5000/temp,就可以显示下图:

       过滤器:允许变量输出显示之前改变变量的值,模板中使用语法:{{变量|过滤器}},jinja2文档中常用过滤器如下:

    过滤器名 作用
    capitalize 将变量值首字母大写,其他字母小写
    lower 将变量值所有字母小写
    upper 将变量值所有字母大写
    title 将变量中每个单词首字母大写
    trim 将变量值两端空格去掉

     

     

     

     

     

     

     

      

      控制结构

        1.if结构:

    {%  if 条件 %}

    条件成立的标签代码

    {%  elif 条件 %}

    条件成立的标签代码

    {%  else %}

    条件不成立的标签代码

    {%  endif %}

    2.for循环结构:

    {%  for i in 列表|元组|字典 %}

    标签代码

    {%  endfor %}

    3.宏(模板中的函数):一般将若干个宏单独放在一个模板文件(macro.html)中,使用时导入{%  import ‘macro.html’ as macros %}

      <!--  宏的定义 -->

      {%  mscro 函数名(形参) %}

      函数体要执行的标签代码

      {%  endmscro %}

      <!--  宏的调用 -->

      {{函数名(实参)}}

    4.模板的包含:可以直接复用xxx.html,如导航栏

      {%  include 'xxx.html' %}

    静态文件:所有静态文件都放在Flask项目文件下的static文件夹中,如css、js、images

      <img src="/static/images/xxx.jpg">

    模板的继承

      1.父模板中需要指定哪些板块是可以是被重写

        {%  block 块名 %}

        可被重写的标签代码

        {%  endblock %}

      2.子模板中

    • 使用{%  extends '父模板名' %}来完成继承
    • 使用{%  block 块名 %} 重写的标签代码 {%  endblock %}来完成覆盖重写
    • 使用{%  block 块名 %} {%  super() %} 重写的标签代码 {%  endblock %}来完成继承重写

     自定义错误页面:不使用Flask默认的报错页面

      @app.errorhandler(404)

      def page_not_found(e):

        return render_templates('404.html'),404

  • 相关阅读:
    js apply 和call的区别
    TensorFlow 便捷的实现机器学习 三
    logistic regression model
    特征工程
    生成模式以及判别模式
    PCA降维技术
    TensorFlow 入门之手写识别CNN 三
    机器学习学习笔记1
    TensorFlow 入门之手写识别(MNIST) softmax算法 二
    TensorFlow 入门之手写识别(MNIST) 数据处理 一
  • 原文地址:https://www.cnblogs.com/lennie-luo/p/13296905.html
Copyright © 2011-2022 走看看