ll1123

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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

posted on 2020-07-14 02:06  Lennie-L  阅读(152)  评论(0编辑  收藏  举报