#! /usr/bin/env python3

# -*- coding:utf-8 -*-

#MVC:Model-View-Controller 模型-视图-控制器

#Python处理URL的函数就是C(controller),controller负责业务逻辑,比如检查用户名是否存在,取出用户信息等

#包含变量的HTML代码就是模板V(view),view负责显示逻辑,展现页面,通过简单地替换一些变量,view最终输出的就是用户看到的HTML。

#Model 是用来存储传递给VIEW的变量的。通常Model就是一个dict。

#将flask_1.py中的例子改成MVC模式:

from flask import Flask,request,render_template

app=Flask(__name__)

@app.route('/',methods=['GET','POST'])

def home():

return render_template('home.html')

@app.route('/signin',methods=['GET'])

def signin_form():

return render_template('form.html')

@app.route('/signin',methods=['POST'])

def signin():

username=request.form['username']

password=request.form['password']

if username=='admin' and password=='password':

return render_template('signin-ok.html',username=username)

return render_template('form.html',message='Bad username or password',username=username)

if __name__=='__main__':

app.run()

#Flask 通过render_template()函数来实现模块的渲染。和web框架类似,Python的模板也有很多种,Flask默认支持的模板是jinja2.

#home.html 用来显示首页的模板:

'''

<html>

<head>

<title>Home</title>

</head>

<body>

<h1 style="font-style:italic">Home</h1>

</body>

</html>

'''

#form.html 用来显示登录表单的模板:

'''

<html>

<head>

<title>Please Sign In</title>

</head>

<body>

{% if message %}

<p style="color:red">{{message}}</p>

{% endif %}

<form action="/signin" method="post">

<legend>Please sign in:</legend>

<p><input name="username"placeholder="Username"value="{{username}}"></p>

<p><input name="password"placeholder="Password" type="password"</p>

<p><button type="submit">Sign In</button></p>

</form>

</body>

</html>

'''

#signin-ok.html 登录成功的模板

'''

<html>

<head>

<title>Welcome,{{username}}</title>

</head>

<body>

<p>Welcome,{{username}}!</p>

</body>

</html>

'''

#登录失败的模板呢?我们在form.html中加了一点判断,把form.html重用为登录失败的模板。

#最后,一定要把模板放到正确的templates目录下,templates和webMVC.py在同级目录下.

#通过MVC,我们在Python代码中处理M(model)和C(controller),而v(view)是通过模板处理的,这样,我们就成功地把Python代码和HTML代码最大限度地分离了。

#使用模板的另一大好处是,模板改起来很方便,而且,改完保存后,刷新浏览器就能看到最新的效果,这对于调试HTML、CSS和JavaScript的前端工程师来说实在太重要。

#在jinja2模板中,我们用{{name}}表示一个需要替换的变量。很多时候,还需要循环、条件判断等指令语句,在jinja2中,用{%...%}表示指令。

#比如循环输出页码:

'''

{% for i in page_list %}

<a href="/page/{{i}}</a>

{% endfor %}

'''

#如果page_list是一个list:[1,2,3,4,5],上面的模板将输出5个超链接。

#除了jinja2,常见的模板还有:

'''

Mako:用<%...%>和${xxx}的一个模板

Cheetah:也是用<%...%>和${xxx}的一个模板

Django:Django是一站式框架,内置一个用{%...%}和{{xxx}}的模板

'''

网页的MVC模式简介的更多相关文章

  1. Java的MVC模式简介

    Java的MVC模式简介 MVC(Model View Control)模型-视图-控制器 首先我们需要知道MVC模式并不是javaweb项目中独有的,MVC是一种软件工程中的一种软件架构模式,把软件 ...

  2. MVC模式简介

    MVC模式是一种表现模式,它将web应用程序分成三个主要部分即:模型(Model)视图(View)控制器(Controller)M:Model主要是存储或者是处理数据的模型,包含了用户使用的数据,业务 ...

  3. mvvm模式和mvc模式 概述总结对比

    1.mvc模式简介: MVC的全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,是一种软件设计典范.例如: angular ...

  4. MVC 模式

    1.MVC 模式简介 MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式.这种模式用于应用程序的分层开发.Model(模型):模型代表一个存取数据的对象或 JAV ...

  5. 【iOS 开发】iOS 开发 简介 (IOS项目文件 | MVC 模式 | 事件响应机制 | Storyboard 控制界面 | 代码控制界面 | Retina 屏幕图片适配)

    一. iOS 项目简介 1. iOS 文件简介 创建一个 HelloWorld 项目, 在这个 IOS 项目中有四个目录 : 如下图; -- HelloWorldTests 目录 : 单元测试相关的类 ...

  6. Django简介以及MVC模式

    一.简介 Django,是当前Python世界里最负盛名且成熟的网络框架.最初用来制作在线新闻的Web站点. Django是一个基于python的web重量级框架 重指的是为发开者考虑的多 采用了MV ...

  7. MVC模式与三层架构和表示层

    1.MVC模式     - Model-View-Controller     - 模型-视图-控制器     - Model(模型)         > 模型分为业务模型,和数据模型     ...

  8. Dot Net设计模式—MVC模式

    1 MVC设计模式简介 MVC结构是为那些需要为同样的数据提供多个视图的应用程序而设计的,它很好的实现了数据层与表示层的分离.MVC作为一种开发模型,通常用于分布式应用系统的设计和分析中,以及用于确定 ...

  9. Android 腾讯入门教程( 智能手表UI设计 和 MVC模式 )

    *****注意到mvc 在android 中是如何进行分层分域执行各自的功能.**** 官方推荐的按钮尺寸是48像素 前端之Android入门(1):环境配置 前端之Android入门(2):程序目录 ...

随机推荐

  1. Pandas存储为Excel格式:单个xlsx文件下多sheet存储方法

    Notes If passing an existing ExcelWriter object, then the sheet will be added to the existing workbo ...

  2. PyMongo官方文档翻译——VNPY

    PyMongo是MongoDB数据库的python模块 VNPY默认的数据库,没有采用SQL类型的数据库,而是采用No-Sql类型的MongoDB数据库, 对于想了解VNPY内部结构的童鞋,多多少少会 ...

  3. 安卓中使用OkHttp发送数据请求的两种方式(同、异步的GET、POST) 示例-- Android基础

    1.首先看一下最终效果的截图,看看是不是你想要的,这个年代大家都很忙,开门见山很重要! 简要说下,点击不同按钮可以实现通过不同的方式发送OkHttp请求,并返回数据,这里请求的是网页,所以返回的都是些 ...

  4. Confluence 6 空间标识

    每一个 Confluence 空间都有一个 空间标识(space key),这个空间标识是简短并且是唯一的,这个标识被用来构建到空间的 URL 中. 当你创建一个站点空间,Confluence 将会为 ...

  5. 如何阻止div中的子div触发div的事件

    <div class="sideFrame" v-on:click="hideside"> <div class="sideFram ...

  6. 2017-2018 ACM-ICPC, NEERC, Northern Subregional ContestG - Grand Test

    题意:找三条同起点同终点的不相交的路径 题解:用tarjan的思想,记录两个low表示最小和次小的dfs序,以及最小和次小的位置,如果次小的dfs序比dfn小,那么说明有两条返祖边,那么就是满足条件的 ...

  7. ACM-ICPC 2018 南京赛区网络预赛Skr

    题意:求本质不同的回文子串的和 题解:先构造pam,然后根据pam的原理(ch表示在该节点表示的回文串两侧加上该字符)对于每个节点维护一个表示该节点字符串的值,加起来即可 //#pragma GCC ...

  8. 【PowerDesigner】【6】Table视图同时显示Code和Name

    效果图: —————————————————————— 步骤: 文字版: 1,顶部工具栏Tools→Display Preference 2,Columns→List columns右侧按钮 3,勾选 ...

  9. Git-解释“Swap file .MERGE_MSG.swp already exists”的问题

    当合并代码时非正常保存退出遇到的问题. 博客原文: https://blog.csdn.net/qq_32452623/article/details/78395832

  10. input type="number" 时 maxlength不起作用

    给input标签添加 oninput=“if(value.length>11) value=value.slice(0,11)”