我是跟着廖雪峰老师学习的,对于我这样的纯小白来说,跟着他的网站学习,简直是被妈妈抱在怀里一样无忧无虑,这样的学习本来没有记录下来的必要,但是由于我的粗心大意,经常会出现一些错误,所以我决定把这些错误记录下来,顺便把知识网络也记下来

网站地址:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432012393132788f71e0edad4676a3f76ac7776f3a16000

参考链接:https://aiohttp.readthedocs.io/en/stable/web_quickstart.html#run-a-simple-web-server

一、WSGI接口

  可以通过这个接口,将更复杂的HTTP协议交给模块处理,而只专注与web业务

  通过WSGI接口,只要求开发者实现一个函数,就能响应HTTP请求

  无多多么复杂的web应用程序,入口都是一个WSGI处理函数。HTTP请求的所有输入信息都可以通过 environ 获得,HTTP响应的输出都可以通过 start_response() 加上函数返回值作为Body

  复杂的web应用程序,光靠一个WSGI函数来处理还是太底层了,我们需要在WSGI之上在抽象出来一些框架,进一步简化Web开发

  

出现的问题:

  问题:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb3 in position 0: invalid start byte

  解决办法:计算机名字是中文的,改成英文的

  

  问题:localhost 拒绝了我们的连接请求。

  解决办法:因为我是在虚拟环境里运行的程序,但是为了编辑方便,我就打开了IDLE(在IDLE里编辑,然后在命令行里运行)结果就出现了这个错误,把IDLE关了就好了

二、使用Web框架

  通过使用框架,能让我们只专注于一个函数处理一个URL,而不必关注与URL到函数之间的映射,则交给web框架去完成,web框架完成了在WSGI接口上进一步的抽象,有很多框架可以供我们使用,这里以Flask为例

  每个URL对应的GET和POST请求(当然还有其他的请求)都可以单独映射为两个函数处理或交给一个函数去处理,使用框架后,框架通过python的装饰器在内部自动的把不同的URL映射到相应的函数

  

  1. from flask import Flask
  2. from flask import request
  3.  
  4. app=Flask(__name__)
  5.  
  6. @app.route('/',methods=['GET','POST'])#路径和请求方式,默认是127.0.0.1,怎么配置别的我还不知道
  7. def home():
  8. return '<h1>Home</h1>'
  9.  
  10. @app.route('/signin',methods=['GET'])
  11. def singnin_form():
  12. return'''<form action="/signin" method="post">#action代表提交到的地址
  13. <p><input name="username"></p>
  14. <p><input name="password" type="password"></p>
  15. <p><button type="submit">Sign In</button></p>
  16. </form>'''
  17.  
  18. @app.route('/signin',methods=['POST'])
  19. def singin():
  20. #需要从request对象读取表单内容:
  21. if request.form['username']=='admin' and request.form['password']=='123':#获取表单内容的方式
  22. return'<h3>Hello admin</h3>'
  23. return '<h3>Bad username or password.</h3>'
  24.  
  25. if __name__=='__main__':
  26. app.run()

  在编写URL处理函数时,除了配置URL外,从HTTP请求拿到用户数据也是非常重要的。Web框架都提供了自己的API来实现这些功能。Flask通过 request.form['name'] 来获取表单的内容。

  教程地址:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432012745805707cb9f00a484d968c72dbb7cfc90b91000#0

出现的问题

  问题:按下表单按钮后没有反应,并且链接也变成了 http://127.0.0.1:5000/signin?username=admin&password=

  解决办法:一开始为认为如果没有响应,那么一定是映射的问题(后来才知道其实还可能是部件写错了)。是以为对函数的映射出了问题,然后去找没有发现,后来经过与老师代码的比对才发现构建表单时的代码写错了

  1. <form action="/signin" methods="post">#action代表提交到的地址
  2. #应该是
  3. <form action="/signin" method="post">#action代表提交到的地址

  

三、使用模板

  通过字符串来构建web页面是不可行的,所以模板技术出现了。使用模板,我们必须先准备一个HTML文档,这个文档并不是普通的HTML文档,而是带有参数和变量的,然后根据我们传入的数据,替换后,得到最终的HTML,发给用户。

  这就是MVC(model-view-controller)模型视图 控制器

  控制器负责任务逻辑,比如登录时检查用户名和密码是否正确,python中处理URL的相应函数就是控制器

  视图就是用来展示给用户的界面,不过需要经过处理。需要填入一些我们的数据

  模型就是要向视图中填入的数据,是用来传给view的,view在替换变量的时候,就从model中取出相应的数据

  只是因为Python支持关键字参数,很多Web框架允许传入关键字参数,然后,在框架内部组装出一个dict作为Model。

  

使用:

  Flask通过 render_template() 函数来实现模板的渲染。和Web框架类似,Python的模板也有很多种。Flask默认支持的模板是jinja2,所以我们需要先直接安装jinja2

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

  1. from flask import Flask, request, render_template
  2.  
  3. app = Flask(__name__)
  4.  
  5. @app.route('/', methods=['GET', 'POST'])
  6. def home():
  7. return render_template('home.html')
  8. --snip--

 

  然后,开始编写jinja2模板:

  1. #代码见链接
    #home.html 用来显示首页的模板:
  2. --snip--
  3.  
  4. #form.html 用来显示登录表单的模板
    <html>
  5. <head>
  6. <title>Please Sign In</title>
  7. </head>
  8. <body>
  9. {% if message %}#命令
  10. <p style="color:red">{{ message }}</p>#参数
  11. {% endif %}
  12. <form action="/signin" method="post">
  13. <legend>Please sign in:</legend>
  14. <p><input name="username" placeholder="Username" value="{{ username }}"></p>
  15. <p><input name="password" placeholder="Password" type="password"></p>
  16. <p><button type="submit">Sign In</button></p>
  17. </form>
  18. </body>
  19. </html>
  20. #signin-ok.html登录成功的模板:
    --snip--

指令的使用方法实例  

  1. {% for i in page_list %}#如果page_list是一个列表:123,下面代码会输出5个超链接
  2. <a href="/page/{{ i }}">{{ i }}</a>
  3. {% endfor %}

     

最后,一定要把模板放到正确的 templates 目录下, templates 和 app.py 在同级目录下,这个templates需要新建

通过MVC,我们在Python代码中处理M:Model(就是个性化的数据)和C:Controller,而V:View是通过模板处理的(由模板是大部分已经完成的,只是还需要些数据),这样,我们就成功地把Python代码和HTML代码最大限度地分离了。

遇到问题:

  问题:500 internal server error

  1. Traceback (most recent call last):
  2. File "C:\Users\Administrator.SC-201605202132\Envs\web_go\lib\site-packages\flask\app.py", line 2292, in wsgi_app
  3. response = self.full_dispatch_request()
  4. File "C:\Users\Administrator.SC-201605202132\Envs\web_go\lib\site-packages\flask\app.py", line 1815, in full_dispatch_request
  5. rv = self.handle_user_exception(e)
  6. File "C:\Users\Administrator.SC-201605202132\Envs\web_go\lib\site-packages\flask\app.py", line 1718, in handle_user_exception
  7. reraise(exc_type, exc_value, tb)
  8. File "C:\Users\Administrator.SC-201605202132\Envs\web_go\lib\site-packages\flask\_compat.py", line 35, in reraise
  9.  
  10. raise value
  11. File "C:\Users\Administrator.SC-201605202132\Envs\web_go\lib\site-packages\flask\app.py", line 1813, in full_dispatch_request
  12. rv = self.dispatch_request()
  13. File "C:\Users\Administrator.SC-201605202132\Envs\web_go\lib\site-packages\flask\app.py", line 1799, in dispatch_request
  14. return self.view_functions[rule.endpoint](**req.view_args)
  15. File "./envs/web_go/app.py", line 21, in singin
  16. return render_template('signin_ok.html',username=username)
  17. File "C:\Users\Administrator.SC-201605202132\Envs\web_go\lib\site-packages\flask\templating.py", line 134, in render_template
  18. return _render(ctx.app.jinja_env.get_or_select_template(template_name_or_list),
  19. File "C:\Users\Administrator.SC-201605202132\Envs\web_go\lib\site-packages\jinja2\environment.py", line 869, in get_or_select_template
  20. return self.get_template(template_name_or_list, parent, globals)
  21. File "C:\Users\Administrator.SC-201605202132\Envs\web_go\lib\site-packages\jinja2\environment.py", line 830, in get_template
  22. return self._load_template(name, self.make_globals(globals))
  23. File "C:\Users\Administrator.SC-201605202132\Envs\web_go\lib\site-packages\jinja2\environment.py", line 804, in _load_template
  24. template = self.loader.load(self, name, globals)
  25. File "C:\Users\Administrator.SC-201605202132\Envs\web_go\lib\site-packages\jinja2\loaders.py", line 113, in load
  26. source, filename, uptodate = self.get_source(environment, name)
  27. File "C:\Users\Administrator.SC-201605202132\Envs\web_go\lib\site-packages\flask\templating.py", line 58, in get_source
  28. return self._get_source_fast(environment, template)
  29. File "C:\Users\Administrator.SC-201605202132\Envs\web_go\lib\site-packages\flask\templating.py", line 86, in _get_source_fast
  30. raise TemplateNotFound(template)
  31. jinja2.exceptions.TemplateNotFound: signin_ok.html
  32. 127.0.0.1 - - [18/Mar/2019 14:23:12] "POST /signin HTTP/1.1" 500 -

  解决办法: 阅读错误信息,发现是目标页面的名字拼错了(要认真阅读提示)

python web开发 框架 模板 MVC的更多相关文章

  1. 第十七章:Python の Web开发基础(四) MVC与Django

    本課主題 MVC 介绍 Django 介紹 MVC 介绍 controllers 处理用户请求 views 放置HTML模版 models 操作数据库 MVC框架就是目录的归类 MVC 是一种软件开发 ...

  2. tornado 学习笔记2 Python web主流框架

    2.1 Django 官方网址:https://www.djangoproject.com/ 简介:Django is a high-level Python Web framework that e ...

  3. Python Web开发:Django+BootStrap实现简单的博客项目

    创建blog的项目结构 关于如何创建一个Django项目,请查看[Python Web开发:使用Django框架创建HolleWorld项目] 创建blog的数据模型 创建一个文章类 所有开发都是数据 ...

  4. Java Web开发和Python Web开发之间的区别

    今天的文章讨论了Java Web开发和Python Web开发之间的区别.我不鼓励我们在这里从Java Web迁移到Python Web开发.我只是想谈谈我的感受.它不一定适合所有情况,仅供我们参考. ...

  5. python web 开发学习路线

    转载,备着 自己目前学习python web 开发, 经过两个月的摸索,目前对web开发有了浅显的认识,把自己的学习过程贴出来.1.python入门推荐老齐<从零开始学python>,&l ...

  6. 《Python Web开发实战》|百度网盘免费下载|Python Web开发

    <Python Web开发实战>|百度网盘免费下载|Python Web开发 提取码:rnz4 内容简介 这本书涵盖了Web开发的方方面面,可以分为如下部分: 1. 使用最新的Flask ...

  7. windows下python web开发环境的搭建

    windows下python web开发环境: python2.7,django1.5.1,eclipse4.3.2,pydev3.4.1 一. python环境安装 https://www.pyth ...

  8. Python Web开发中的WSGI协议简介

    在Python Web开发中,我们一般使用Flask.Django等web框架来开发应用程序,生产环境中将应用部署到Apache.Nginx等web服务器时,还需要uWSGI或者Gunicorn.一个 ...

  9. 转载:Python Web开发最难懂的WSGI协议,到底包含哪些内容?

    原文:PSC推出的第二篇文章-<Python Web开发最难懂的WSGI协议,到底包含哪些内容?>-2017.9.27 我想大部分Python开发者最先接触到的方向是WEB方向(因为总是有 ...

随机推荐

  1. 对比学习用 Keras 搭建 CNN RNN 等常用神经网络

    Keras 是一个兼容 Theano 和 Tensorflow 的神经网络高级包, 用他来组件一个神经网络更加快速, 几条语句就搞定了. 而且广泛的兼容性能使 Keras 在 Windows 和 Ma ...

  2. MyBatis数据持久化(四)类型别名

    Mybatis的类型别名指的是我们可以为Java类型自定义一个简短的名字,以达到简化配置的目的,在上篇博文中我们的sql语句配置文件内容如下: <?xml version="1.0&q ...

  3. 【转载】java编程中'为了性能'一些尽量做到的地方

    1.尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面 第一,控制资源的使用,通过线程同步来控制资 ...

  4. ActiveMQ学习笔记(4)----JMS的API结构和开发步骤

    1. JMS的API结构 其实上图中的五个API在第一节中我们都已经使用到了.本节将会讲非持久化和持久化topic的使用. 2. JMS的基本开发步骤 1. 创建一个JMS工厂,  Connectio ...

  5. [SDOI2008]沙拉公主的困惑 线性筛_欧拉函数_逆元_快速幂

    Code: #include<cstdio> using namespace std; typedef long long ll; const int maxn=10000000+1; l ...

  6. ajax同时提交表单且包含文件

    说明一下:FormData对象是html5的一个对象,目前的一些主流的浏览器都已经兼容.ie8暂时不支持,不支持FormData的,可以使用方法二,下面会介绍.接着说FormData,它是一个html ...

  7. Docker本地私有仓库实战

    Docker仓库主要用于存放Docker镜像,Docker仓库分为公共仓库和私有仓库,基于registry可以搭建本地私有仓库,使用私有仓库的优点如下: 1)节省网络带宽,针对于每个镜像不用去Dock ...

  8. 队列(Queue)-c实现

    相对而言,队列是比较简单的. 代码还有些warning,我改不动,要找gz帮忙. #include <stdio.h> typedef struct node { int data; st ...

  9. 重载和const形参

    1.int lookup(string p); 2.int lookup(const string p);//同1 3.int lookup(string *);//传入一个指针,指针指向string ...

  10. numpy学习笔记 - numpy常用函数、向量化操作及基本数学统计方法

    # -*- coding: utf-8 -*-"""主要记录代码,相关说明采用注释形势,供日常总结.查阅使用,不定时更新.Created on Fri Aug 24 19 ...