我是跟着廖雪峰老师学习的,对于我这样的纯小白来讲,跟着他的网站学习,简直是被妈妈抱在怀里同样无忧无虑,这样的学习原本没有记录下来的必要,可是因为个人粗枝大叶,常常会出现一些错误,因此我决定把这些错误记录下来,顺便把知识网络也记下来html
网站地址:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432012393132788f71e0edad4676a3f76ac7776f3a16000python
参考连接:https://aiohttp.readthedocs.io/en/stable/web_quickstart.html#run-a-simple-web-serverweb
1、WSGI接口flask
能够经过这个接口,将更复杂的HTTP协议交给模块处理,而只专一与web业务网络
经过WSGI接口,只要求开发者实现一个函数,就能响应HTTP请求app
无多多么复杂的web应用程序,入口都是一个WSGI处理函数。HTTP请求的全部输入信息均可以经过 environ 得到,HTTP响应的输出均可以经过 start_response() 加上函数返回值做为Body框架
复杂的web应用程序,光靠一个WSGI函数来处理仍是太底层了,咱们须要在WSGI之上在抽象出来一些框架,进一步简化Web开发函数
出现的问题:post
问题:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb3 in position 0: invalid start byte学习
解决办法:计算机名字是中文的,改为英文的
问题:localhost 拒绝了咱们的链接请求。
解决办法:由于我是在虚拟环境里运行的程序,可是为了编辑方便,我就打开了IDLE(在IDLE里编辑,而后在命令行里运行)结果就出现了这个错误,把IDLE关了就行了
2、使用Web框架
经过使用框架,能让咱们只专一于一个函数处理一个URL,而没必要关注与URL到函数之间的映射,则交给web框架去完成,web框架完成了在WSGI接口上进一步的抽象,有不少框架能够供咱们使用,这里以Flask为例
每一个URL对应的GET和POST请求(固然还有其余的请求)均可以单独映射为两个函数处理或交给一个函数去处理,使用框架后,框架经过python的装饰器在内部自动的把不一样的URL映射到相应的函数
from flask import Flask from flask import request app=Flask(__name__) @app.route('/',methods=['GET','POST'])#路径和请求方式,默认是127.0.0.1,怎么配置别的我还不知道 def home(): return '<h1>Home</h1>' @app.route('/signin',methods=['GET']) def singnin_form(): return'''<form action="/signin" method="post">#action表明提交到的地址 <p><input name="username"></p> <p><input name="password" type="password"></p> <p><button type="submit">Sign In</button></p> </form>''' @app.route('/signin',methods=['POST']) def singin(): #须要从request对象读取表单内容: if request.form['username']=='admin' and request.form['password']=='123':#获取表单内容的方式 return'<h3>Hello admin</h3>' return '<h3>Bad username or password.</h3>' if __name__=='__main__': 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=
解决办法:一开始为认为若是没有响应,那么必定是映射的问题(后来才知道其实还多是部件写错了)。是觉得对函数的映射出了问题,而后去找没有发现,后来通过与老师代码的比对才发现构建表单时的代码写错了
<form action="/signin" methods="post">#action表明提交到的地址 #应该是 <form action="/signin" method="post">#action表明提交到的地址
3、使用模板
经过字符串来构建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中,用 {% ... %} 表示指令。
from flask import Flask, request, render_template app = Flask(__name__) @app.route('/', methods=['GET', 'POST']) def home(): return render_template('home.html') --snip--
而后,开始编写jinja2模板:
#代码见连接
#home.html 用来显示首页的模板: --snip-- #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登陆成功的模板:
--snip--
指令的使用方法实例
{% for i in page_list %}#若是page_list是一个列表:一、二、3,下面代码会输出5个超连接 <a href="/page/{{ i }}">{{ i }}</a> {% endfor %}
最后,必定要把模板放到正确的 templates 目录下, templates 和 app.py 在同级目录下,这个templates须要新建
经过MVC,咱们在Python代码中处理M:Model(就是个性化的数据)和C:Controller,而V:View是经过模板处理的(由模板是大部分已经完成的,只是还须要些数据),这样,咱们就成功地把Python代码和HTML代码最大限度地分离了。
遇到问题:
问题:500 internal server error
Traceback (most recent call last): File "C:\Users\Administrator.SC-201605202132\Envs\web_go\lib\site-packages\flask\app.py", line 2292, in wsgi_app response = self.full_dispatch_request() File "C:\Users\Administrator.SC-201605202132\Envs\web_go\lib\site-packages\flask\app.py", line 1815, in full_dispatch_request rv = self.handle_user_exception(e) File "C:\Users\Administrator.SC-201605202132\Envs\web_go\lib\site-packages\flask\app.py", line 1718, in handle_user_exception reraise(exc_type, exc_value, tb) File "C:\Users\Administrator.SC-201605202132\Envs\web_go\lib\site-packages\flask\_compat.py", line 35, in reraise raise value File "C:\Users\Administrator.SC-201605202132\Envs\web_go\lib\site-packages\flask\app.py", line 1813, in full_dispatch_request rv = self.dispatch_request() File "C:\Users\Administrator.SC-201605202132\Envs\web_go\lib\site-packages\flask\app.py", line 1799, in dispatch_request return self.view_functions[rule.endpoint](**req.view_args) File "./envs/web_go/app.py", line 21, in singin return render_template('signin_ok.html',username=username) File "C:\Users\Administrator.SC-201605202132\Envs\web_go\lib\site-packages\flask\templating.py", line 134, in render_template return _render(ctx.app.jinja_env.get_or_select_template(template_name_or_list), File "C:\Users\Administrator.SC-201605202132\Envs\web_go\lib\site-packages\jinja2\environment.py", line 869, in get_or_select_template return self.get_template(template_name_or_list, parent, globals) File "C:\Users\Administrator.SC-201605202132\Envs\web_go\lib\site-packages\jinja2\environment.py", line 830, in get_template return self._load_template(name, self.make_globals(globals)) File "C:\Users\Administrator.SC-201605202132\Envs\web_go\lib\site-packages\jinja2\environment.py", line 804, in _load_template template = self.loader.load(self, name, globals) File "C:\Users\Administrator.SC-201605202132\Envs\web_go\lib\site-packages\jinja2\loaders.py", line 113, in load source, filename, uptodate = self.get_source(environment, name) File "C:\Users\Administrator.SC-201605202132\Envs\web_go\lib\site-packages\flask\templating.py", line 58, in get_source return self._get_source_fast(environment, template) File "C:\Users\Administrator.SC-201605202132\Envs\web_go\lib\site-packages\flask\templating.py", line 86, in _get_source_fast raise TemplateNotFound(template) jinja2.exceptions.TemplateNotFound: signin_ok.html 127.0.0.1 - - [18/Mar/2019 14:23:12] "POST /signin HTTP/1.1" 500 -
解决办法: 阅读错误信息,发现是目标页面的名字拼错了(要认真阅读提示)