一web应用

web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件。应用程序有两种模式C/S、B/S。

下面来看一个简单的socket服务器

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

import socket
sk=socket.socket()
sk.bind(('127.0.0.1',8080))
sk.listen() while 1:
conn,client_addr=sk.accept()
conn.recv(1024)
conn.send(b'hello')
conn.close()
sk.close()

然后我们通过浏览器访问,浏览器出现错误信息:该网页无法正常运作

什么原因呢?我们先来看看收到请求的输出信息

data b'GET / HTTP/1.1\r\nHost: 127.0.0.1:8800\r\nConnection: keep-alive\r\nCache-Control: max-age=0\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.79 Safari/537.36\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\nAccept-Encoding: gzip, deflate, br\r\nAccept-Language: zh-CN,zh;q=0.9\r\nCookie: csrftoken=IwhDDZ9RiKQUV4T5CbzGIhAcVZNxYuvAYdS7RKc0tmOmk02hHWfQ8sWnIGrN1pzC\r\n\r\n'

这个完整的信息里面可以看到:最开始它有个http的头部信息,这个是个标准,那么我们试着去加入

改为

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

import socket
sk=socket.socket()
sk.bind(('127.0.0.1',8080))
sk.listen() while 1:
conn,client_addr=sk.accept()
conn.recv(1024)
conn.send(b'HTTP/1.1 200 OK\r\n\r\n') #需要一个http的头
conn.send(b'<h1>o98k</h1>') #发送的主体,也可以放入上面的那行
conn.close()
sk.close()

现在访问正常了,也能输出我们要的信息

如果我们要根据用户输入的路径访问不同的页面呢

1 我们可以做判断,然后指向不同的函数

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

import socket
sk=socket.socket()
sk.bind(('127.0.0.1',8080))
sk.listen() def home(url):
return b"this is home page" def index(url):
return b'this is index home' while 1:
conn,client_addr=sk.accept()
data=conn.recv(1024)
data_str=str(data,encoding='utf8')
url=data_str.split('\r\n')[0].split()[1]
print(url)
print('='*30)
if url=='/index/':
msg=index(url)
elif url =="/home/":
msg=home(url)
else:
msg=b"404!"
conn.send(b'HTTP/1.1 200 OK\r\n\r\n') #需要一个http的头
conn.send(msg) #发送的主体,也可以放入上面的那行
conn.close()
sk.close()

2 我们可以将这些不同的页面单独拿出来(比如文件),然后指向他们

# -*- coding:utf-8 -*-
import socket
sk=socket.socket()
sk.bind(('127.0.0.1',8080))
sk.listen() def home(url):
with open("home.html",'rb')as f:
html_msg=f.read()
return html_msg def index(url):
return b'this is index home' while 1:
conn,client_addr=sk.accept()
data=conn.recv(1024)
data_str=str(data,encoding='utf8')
url=data_str.split('\r\n')[0].split()[1]
print(url)
print('='*120)
if url=='/index/':
msg=index(url)
elif url =="/home/":
msg=home(url)
else:
msg=b"404!"
conn.send(b'HTTP/1.1 200 OK\r\n\r\n') #需要一个http的头
conn.send(msg) #发送的主体,也可以放入上面的那行
conn.close()
sk.close()

3 我们将他们优化一下,比如将要访问的页面放入一个列表,并且带有一点动态网页的效果

# -*- coding:utf-8 -*-
import socket
import time
sk=socket.socket()
sk.bind(('127.0.0.1',8080))
sk.listen() def home(url):
with open("home.html",'r')as f:
html_msg=f.read() now=time.time()
msg=html_msg.replace("uf;afsaf ",str(now))
return bytes(msg,encoding='utf8') def index(url):
return b'this is index home' def user(url):
return b'this is user page' url_func=[
('/index/',index),
('/home/',home),
('/user/',user), ] while 1:
conn,client_addr=sk.accept()
data=conn.recv(1024)
data_str=str(data,encoding='utf8')
url=data_str.split('\r\n')[0].split()[1]
func=None
for i in url_func:
if i[0]== url:
func=i[1]
break
if func:
msg=func(url)
else:
msg=b"404!"
conn.send(b'HTTP/1.1 200 OK\r\n\r\n') #需要一个http的头
conn.send(msg) #发送的主体,也可以放入上面的那行
conn.close()
sk.close()

这里简单说说http协议:

端口号80 ;HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于万维网(WWW:World Wide Web )服务器与本地浏览器之间传输超文本的传送协议。

http协议的特点:

http协议是基于TCP/IP协议之上的应用层协议。

HTTP协议规定,请求从客户端发出,最后服务器端响应该请求并 返回。换句话说,肯定是先从客户端开始建立通信的,服务器端在没有 接收到请求之前不会发送响应

HTTP是一种不保存状态,即无状态(stateless)协议。HTTP协议 自身不对请求和响应之间的通信状态进行保存。也就是说在HTTP这个 级别,协议对于发送过的请求或响应都不做持久化处理。

服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。这个是http协议无连接的特性

http协议的请求和响应

        浏览器往服务端发的消息叫:请求(request)
请求行 GET /index/ HTTP/1.1
请求头 k1:v1
\r\n
请求体 服务端回复给浏览器的消息叫:响应(response)
响应行 HTTP/1.1 200 OK\r\n
响应头 Content-Type: text/html; charset=utf-8\r\n
k2:v2\r\n
...
\r\n
响应体 我们在浏览器上看到的内容

http的两种请求方式 get post

GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditBook?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的请求体中.
GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.
GET与POST请求在服务端获取请求数据方式不同。

查看Pycharm控制台,使用谷歌浏览器访问一次网页。实际上,是有2次请求的。

第一次,是正常请求。第二次是,favicon.ico请求,它是网页图标问题。这个请求,忽略即可。

GET的数据,是放到url后面的。POST数据是放在请求体后面的。

301重定向

永久性重定向。该状态码表示请求的资源已被分配了新的UR1,以后应使用资源现在所指的URI。也就是说,如果已经把资源对应的URI保存为书签了,这时应该按Location首部字段提示的UR1重新保存。
像下方给出的请求URI,当指定资源路径的最后忘记添加斜杠"/",就会产生301状态码。
http://example.com/sample

302重定向

临时性重定向。该状态码表示请求的资源已被分配了新的URI,希望用户(本次)能使用新的URI访问。

和301MovedPermanently状态码相似,但302状态码代表的资源不是被永久移动,只是临时性质的。换句话说,已移动的资源对应的URI将来还有可能发生改变。比如,用户把URI保存成书签,但不会像301状态码出现时那样去更新书签,
而是仍旧保留返回302状态码的页面对应的URI。

web框架

一个web框架一般实现下面三个动能

    总结:
a. 接收浏览器发送的消息
b. 根据不同的路径返回不同的内容
c. 通过字符串替换 实现 动态网页 Python Web框架分类:
1. 框架自带 a,b,c Tornado
2. 框架自带b,c 使用第三方a Django
3. 框架自带b,使用第三方的a和c Flask 另外一个维度的分类:
1. Django --> 大而全
2. 其他

django之前-----web应用与框架的更多相关文章

  1. Web框架本质及第一个Django实例 Web框架

    Web框架本质及第一个Django实例   Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web ...

  2. python三大web框架Django,Flask,Flask,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架

    Python几种主流框架 从GitHub中整理出的15个最受欢迎的Python开源框架.这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等. Django: Python We ...

  3. Django学习---Web框架及基础知识

    Django学习---Web框架 web框架的本质 我们在学socket,我们创建一个socketserver,然后运行起来,有一个client客户端要连接socket服务端,连接上之后,如果两边都没 ...

  4. Django,Flask,Tornado三大框架对比,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架

    Django 与 Tornado 各自的优缺点Django优点: 大和全(重量级框架)自带orm,template,view 需要的功能也可以去找第三方的app注重高效开发全自动化的管理后台(只需要使 ...

  5. Django之web框架和url路由

    一.web框架 1.什么是web框架 Web框架是用来进行Web应用开发的一个软件架构,开发者在基于Web框架实现自己的业务逻辑.Web应用本质上就是一个socket服务端,而用户的浏览器就是一个so ...

  6. [Python] 利用Django进行Web开发系列(一)

    1 写在前面 在没有接触互联网这个行业的时候,我就一直很好奇网站是怎么构建的.现在虽然从事互联网相关的工作,但是也一直没有接触过Web开发之类的东西,但是兴趣终归还是要有的,而且是需要自己动手去实践的 ...

  7. 利用Django进行Web开发

    Web就是用来表示Internet主机上供外界访问的资源的.网页也统称为web资源.Internet上供外界访问的Web资源主要分为如下两类: 静态web资源:指web页面中供人们浏览的数据始终是不变 ...

  8. 利用Django构建web应用及其部署

    注:很久之前就有了学习Django的想法,最近终于有机会做了一次尝试.由于Django的详细教程很多,我在这里就不再详述了,只是将整个开发流程以及自己在学习Django中的一些思考记录在此. Syst ...

  9. Nginx+uwsgi+Django 的web应用环境部署-完整记录

    Python作为当前最火爆最热门,也是最主要的Web开发语言之一,在其二十多年的历史中出现了数十种Web框架,比如Django.Tornado.Flask.Twisted.Bottle和Web.py等 ...

随机推荐

  1. tk简单使用

    # 引入tk import tkinter as tk class UserLogin(object): """ 初始化窗口 """ def ...

  2. RedHat6.5系统LVM增加新硬盘实现根文件系统扩容

    一.新增物理空间 二.linux中创建新分区 1.首先查看硬盘信息,用fdisk -l命令,如果有硬盘有剩余空间就可以对其进行分区. [root@master 桌面]# fdisk -l Disk / ...

  3. Python依赖打包发布详细

    http://www.cnblogs.com/mywolrd/p/4756005.html 将Python脚本打包成可执行文件   Python是一个脚本语言,被解释器解释执行.它的发布方式: .py ...

  4. js中return ,return true,return false;区别

    js中return:.return true.return false;区别 转:https://www.cnblogs.com/camikehuihui/p/7999537.html 一.返回控制与 ...

  5. ##Truncated incorrect DOUBLE value: 'E#4' 的问题解决

    给sql语句 加了个引号,问题就这么轻易解决了,猜想,应该是mysql 做where对比的时候,把数字5 与数据库里的数据”OABF” 比较,应该是这时的问题.

  6. 基于单片机的Wifi温度湿度测量仪

    这次的制作背景是由于单片机课程实训课程要求 刚好手上有块ESP8266-12F的WiFi模块 于是就选择了制作一个基于单片机,使用WiFi传输数据的温湿度采集测量仪 制作过程: 由于有使用过WiFi模 ...

  7. C++进阶--静态初始化的惨败

    /* Initialization Fiasco 一个会使程序崩溃的细微的问题 */ // 不同文件的编译顺序是不确定的 // 如果一个文件依赖另一个文件的对象先初始化,可能出现问题 // 解决方法: ...

  8. C#修改类模板

    安装目录下 Program Files\vs2013\Common7\IDE\ItemTemplatesCache\CSharp\Code\2052\Class 注意:中文是2052 英文是1033 ...

  9. Python 里面什么时候用一个=,什么时候用两个=

    赋值用=                                                                   i != j != k   >>>> ...

  10. hive中的表

    一.内部表与外部表的比较 Hive表概念和关系型数据库表概念差不多.在Hive里表会和HDFS的一个目录相对应,这个目录会存放表的数据.目录默认是/usr/hive/warehouse/. 比如你在h ...