Web应用

对于所有的web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端

import socket

def handle_request(client):

    buf = client.recv(1024)
client.send("HTTP/1.1 200 OK\r\n\r\n".encode("utf8"))
client.send("<h1 style='color:red'>Hello, yuan</h1>".encode("utf8")) def main(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('localhost',8001))
sock.listen(5) while True:
connection, address = sock.accept()
handle_request(connection)
connection.close() if __name__ == '__main__': main()

最简单的web应用就是先把HTML用文件保存好,用一个现成的HTTP服务器软件,接受用户请求,接受用户请求并返回

如果要动态生成HTML,就需要把上述步骤自己来实现。不过,接受HTTP请求、解析HTTP请求、发送HTTP响应都是苦力活,如果我们自己来写这些底层代码,还没开始写动态HTML呢,就得花个把月去读HTTP规范。

正确的做法是底层代码由专门的服务器软件实现,我们用Python专注于生成HTML文档。因为我们不希望接触到TCP连接、HTTP原始请求和响应格式,所以,需要一个统一的接口,让我们专心用Python编写Web业务。

这个接口就是WSGI:Web Server Gateway Interface。

wsgiref模块

from wsgiref.simple_server import make_server

def application(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return [b'<h1>Hello, web!</h1>'] httpd = make_server('', 8080, application) print('Serving HTTP on port 8000...')
# 开始监听HTTP请求:
httpd.serve_forever()

对比socketserver模块

DIY一个自己的web框架

manage.py

from wsgiref.simple_server import make_server

#  request            response

from app01.views import *

from app01 import urls

def routers():

    URLpattern=urls.URLpattern

    return URLpattern

def applications(environ,start_response):

    path=environ.get("PATH_INFO")
print("path",path)
start_response('200 OK', [('Content-Type', 'text/html'),('Charset', 'utf8')]) urlpattern=routers()
func=None for item in urlpattern:
if path==item[0]:
func=item[1]
break if func:
return [func(environ)]
else:
return [b"<h1>404!<h1>"] # return [b"<h1>hello world<h1>"] if __name__ == '__main__': t=make_server("",8810,applications)
print("server is working...")
t.serve_forever()

urls

from app01.views import *

URLpattern = (
("/login/", login),
)

views

import pymysql

from urllib.parse import parse_qs

def login(request):

    if request.get("REQUEST_METHOD")=="POST":
print("+++++",request) #当请求方式是GET时
# user_union,pwd_union=request.get("QUERY_STRING").split("&")
# _,user=user_union.split("=")
# _,pwd=pwd_union.split("=") # 环境变量 CONTENT_LENGTH 可能是空值 或者 值丢失
try:
request_body_size = int(request.get('CONTENT_LENGTH', 0))
except (ValueError):
request_body_size = 0
# 当请求方式是POST时, 变量将会被放在存在域wsgi.input文件中的HTTP请求信息中, 由WSGI 服务器一起发送.
request_body = request['wsgi.input'].read(request_body_size)
d = parse_qs(request_body) user=d.get(b"user")[0].decode("utf8")
pwd=d.get(b"pwd")[0].decode("utf8") print("user",user,pwd) #连接数据库
conn = pymysql.connect(host='',port= 3306,user = 'root',passwd='',db='s6') #db:库名
#创建游标
cur = conn.cursor() SQL="select * from userinfo2 WHERE NAME ='%s' AND PASSWORD ='%s'"%(user,pwd) cur.execute(SQL) if cur.fetchone(): f=open("templates/backend.html","rb") data=f.read()
data=(data.decode("utf8"))%user
return data.encode("utf8") else:
return b"user or pwd is wrong" else:
f = open("templates/login.html", "rb") data = f.read()
f.close() return data

models

import pymysql

import pymysql
#连接数据库
conn = pymysql.connect(host='',port= 3306,user = 'root',passwd='',db='s6') #db:库名
#创建游标
cur = conn.cursor() # sql='''
# create table userinfo2(
# id INT PRIMARY KEY ,
# name VARCHAR(32) ,
# password VARCHAR(32)
# )
#
# '''
#
# cur.execute(sql)
#
# cur.executemany("insert into userinfo2 values(%s,%s,%s)", [(1,"yuan","123"),
# (2,"alex","456"),
# (3,"egon","789")]) cur.execute("select * from userinfo2 WHERE NAME='yuan' AND PASSWORD ='123'")
#提交
conn.commit()
#关闭指针对象
cur.close()
#关闭连接对象
conn.close()

web应用与web框架(Day65)的更多相关文章

  1. 关于web开发前端h5框架的选择

    关于web开发前端h5框架的选择 看了很多移动版框架都是基于app混合式开发的,不是单独h5网站的基于h5开发的web框架从组件丰富度,兼容性,相关教程来说bootstrap还是最好的react和vu ...

  2. java DI 框架spring(web)、Guice(web)、Dagger&Dagger2(android)

    java DI 框架spring(web).Guice(web).Dagger&Dagger2(android) (待续...)

  3. jQuery Mobile 是创建移动 web 应用程序的框架。

    jQuery Mobile jQuery Mobile 是创建移动 web 应用程序的框架. jQuery Mobile 适用于所有流行的智能手机和平板电脑. jQuery Mobile 使用 HTM ...

  4. PHP做Web开发的MVC框架(Smarty使用说明 )

    PHP做Web开发的MVC框架(Smarty使用说明 ) 一.Smarty简明教程 1.安装演示 下载最新版本的Smarty-3.1.12,然后解压下载的文件.接下来演示Smarty自带的demo例子 ...

  5. 将web容器置于OSGi框架下进行web应用的开发

    将web容器置于OSGi框架下,其实就是将web容器做成OSGi支持的Bundle,再安装到OSGi框架中,这里使用的是Jetty容器. 1.创建一个Eclipse插件项目,在此插件下创建一个WebR ...

  6. Java开发工程师(Web方向) - 04.Spring框架 - 第2章.IoC容器

    第2章.IoC容器 IoC容器概述 abstract: 介绍IoC和bean的用处和使用 IoC容器处于整个Spring框架中比较核心的位置:Core Container: Beans, Core, ...

  7. Web应用渗透测试框架Arachni

    Web应用渗透测试框架Arachni   Arachni是一款Ruby语言编写的Web应用渗透测试框架.当用户指定目标后,该框架可以自动扫描网站页面,对页面中的链接.表单.Cookie.HTTP He ...

  8. Java Web学习总结(28)——Java Web项目MVC开源框架SSH和SSM比较

    SSH和SSM定义 SSH 通常指的是 Struts2 做控制器(controller),spring 管理各层的组件,hibernate 负责持久化层. SSM 则指的是 SpringMVC 做控制 ...

  9. web开发-MVC IoC 框架(转)

    随着Web应用的商业逻辑包含逐渐复杂的公式分析计算.决策支持等,使客户机越 来越不堪重负,因此将系统的商业分离出来.单独形成一部分,这样三层结构产生了. 其中‘层’是逻辑上的划分. 三层体系结构是将整 ...

  10. Web前端三大主流框架是什么?Web前端前景与就业形势

    近十年以来,IT行业发展火热,衍生了很多新职业,例如UI设计师.开发工程师.软件测试工程师等等,在众多备受瞩目的新生职业中,Web前端工程师是其中的一员.那么Web前端三大主流框架是什么呢? 一.We ...

随机推荐

  1. 迅搜sdk试用

    1. sdk支持PHP 2. 针对mysql的某个库的某个表??进行索引,简单的说就是一个project,需要对应一个配置文件: 3. 分索引服务与搜索服务两个,另带中文分词功能:索引数据会有演示,但 ...

  2. 【犀牛书笔记】JavaScript正则表达式的模式匹配

    正则表达式,是一个描述字符模式的对象. JavaScript用RegExp类表示正则表达式 String和RegExp都定义了相关方法 原创文章,转载请注明:http://www.cnblogs.co ...

  3. vmware复制虚拟机出现Error:No suitable device found:no device found for connection 'System eth0'

    vmware复制虚拟机出现Error:No suitable device found:no device found for connection 'System eth0' 废话不多说,直接给出解 ...

  4. 第二百二十六节,jQuery EasyUI,Tree(树)组件

    jQuery EasyUI,Tree(树)组件 本节课重点了解 EasyUI 中 Tree(树)组件的使用方法,这个组件依赖于 Draggable(拖 动)和 Droppable(放置)组件. 一.加 ...

  5. 第一百五十九节,封装库--JavaScript,表单序列化结合ajax提交数据

    封装库--JavaScript,表单序列化结合ajax提交数据 封装库,表单序列化方法 /** xu_lie_biao_dan()方法,表单序列化方法,将自动获取指定表单里面的各项字段name值和va ...

  6. 那些年我读过的Blog(Ⅰ)

    序 近期发现自己已经很久很久没有写过文章,其中包括公开的和非公开的Blog,于是自己去翻了以前很多关注的人的Blog,发现也已经有很大一部分没有更新了,遂有了本文,梳理一下自己那些年关注过并且现在已经 ...

  7. numpy和TensorFlow的函数

    pycharm  jupyter notebook 环境配置

  8. C# 文件读写操作整理

    http://www.cnblogs.com/wangshenhe/archive/2012/05/09/2490438.html

  9. IOS-添加分段控件SegmentControl

    本文转载至 http://www.cnblogs.com/tx8899/archive/2012/06/05/2537020.html 添加分段控件 控件是一种小型的.自包含的UI组件,可以用在各种U ...

  10. iOS-将NSString转换成UTF8编码的NSString

    在使用网络地址时,一般要先将url进行encode成UTF8格式的编码,否则在使用时可能报告网址不存在的错误,这时就需要进行转换 下面就是转换函数: NSString *urlString= [NSS ...