您的位置:首页 > 编程语言

web初识与简易版django代码

2019-06-05 16:53 141 查看

web初识:

http协议

Django是python的web框架之一,既然要学习web框架,首先就要明白什么是http协议。

首先,超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。它规定了客户端与服务端消息传输的格式,是客户端和服务器端请求和应答的标准(TCP)。
四大特性:

1. 基于TCP/IP协议,作用于应用层的协议
    2. 基于请求响应(每一次点击都是一次请求)
    3. 无状态(同一客户端无论连接多少次,它都当你第一次来)
    4. 无连接(websocket,数据请求完成之后就断开)
  数据格式之请求:
  请求首行()
    请求头(一堆k,v键值对)
    (这里是空格,数据格式请求之一!!!)
    请求体(post请求携带的数据)
   数据格式之响应
    响应首行()
    响应头(一堆k,v键值对)
    (这里是空格,数据格式响应之一!!!)
    响应体(post请求携带的数据)
   响应状态码

1xx 服务器已经成功接收到你的数据正在处理,你可以继续提交其他数据
    2xx 请求成功 服务器已经将你的请求的数据发送给你了
    3xx 重定向
    4xx 请求资源错误/不存在
    5xx 服务器错误

软件开发架构:

​ c/s架构:客户端服务端架构

​ b/s架构:浏览器与服务端

本质:b/s架构其实也是c/s架构

什么是web应用:

Web应用程序是一种可以通过Web访问的应用程序。Web应用程序的一个最大好处就是用户很容易访问应用程序。

用户只要有浏览器即可,不需要再安装其他软件。

web应用程序举例:淘宝、天猫、新浪、搜狐

web程序的优点:

  • 网络应用程序强调浏览器的适用性。如果浏览器方没有提供特定的功能,或者弃用特定的平台或操作系统版本(导致不适用),就会影响大量用户;
  • 网络应用依靠互联网远程服务器端的应用文件。因此,当连接出问题时,应用将不能正常使用。
  • 许多网络应用程序不是开源的,只能依赖第三方提供的服务,因此不能针对用户定制化、个性化,而且大多数情况下用户不能离线使用,因而损失了很多灵活性;
  • 它们完全依赖应用服务商的可及性。如果公司倒闭,服务器停止使用,用户也无法追索以前的资料。对比而看,即使软件制造商倒闭了,传统的安装软件也可以继续运行,尽管不能再更新或有其他用户服务;
  • 相似地,提供方公司对软件和其功能有了更大的控制权。只要他们愿意就能为软件添加新特性,即使用户想等bugs先被解决再更新。跳过较差的软件版本也不可能了。公司可以强加不受欢迎的特性给用户,也可以随意减少带宽来削减开支。
  • 公司理论上可以检索任何的用户行为。这有可能引起隐私安全问题。

B/S架构优点

浏览器/服务器架构(Browser/Server,简称B/S)能够很好地应用在广域网上,成为越来越多的企业的选择。浏览器/服务器架构相对于其他几种应用程序体系结构,有如下3方面的优点:

  • 这种架构采用Internet上标准的通信协议(通常是TCP/IP协议)作为客户机同服务器通信的协议。这样可以使位于Internet任意位置的人都能够正常访问服务器。对于服务器来说,通过相应的Web服务和数据库服务可以对数据进行处理。对外采用标准的通信协议,以便共享数据。
  • 在服务器上对数据进行处理,就处理的结果生成网页,以方便客户端直接下载。
  • 在客户机上对数据的处理被进一步简化,将浏览器作为客户端的应用程序,以实现对数据的显示。不再需要为客户端单独编写和安装其他类型的应用程序。这样,在客户端只需要安装一套内置浏览器的操作系统,直接安装一套浏览器,就可以实现服务器上数据的访问。而浏览器是计算机的标准设备

总结一下,本质上:浏览器是一个socket客户端,服务器是一个socket服务端

基于socket写一个web应用

import socketdef server_run():sock = socket.socket()sock.bind(("127.0.0.1",8888))sock.listen(5)while True:conn,addr = sock.accept()recv_data=conn.recv(1024)#1直接在send里写发送的内容,发送到客户端conn.send(b"HTTP/1.1 200 OK\r\n\r\n<h1>hello</h1>")#2打开html文件发送文件到客户端with open("index.html","r",encoding="utf-8") as f:data=f.read()conn.send(("HTTP/1.1 200 OK\r\n\r\n%s"%data).encode("utf-8"))#3动态网页,字符串替换import timenow = time.strftime("%Y-%m-%d %X")print(now)with open("index.html","r",encoding="utf-8") as f:data=f.read()#将读出来的字符串通过替换把时间加到html文件中data = data.replace("@@@",now)conn.send(("HTTP/1.1 200 OK\r\n\r\n%s"%data).encode("utf-8"))
index.html<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Title</title></head><body><h2>@@@</h2><img src="https://gss2.bdstatic.com/9fo3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike92%2C5%2C5%2C92%2C30/sign=5e3814acf9edab64607f4592965fc4a6/14ce36d3d539b600c0c465d0eb50352ac65cb74b.jpg" alt=""></body></html>

手撸一个web低配版django框架

import socketimport pymysqldef index(request):return 'index'def login(request):with open("login.html", "r", encoding="utf-8") as f:data = f.read()return datadef time(request):import datetimenow = datetime.datetime.now().strftime("%Y-%m-%d %X")with open("time.html", "r", encoding="utf-8") as f:data = f.read()data = data.replace("@@time@@", now)return datadef user_list(request):conn = pymysql.connect(host="127.0.0.1",port=3306,user="root",password="123",database="day54",charset="utf8",autocommit=True,)cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)cursor.execute("select id,name,password from user_info")user_list = cursor.fetchall()print(user_list)tr_list = []for user in user_list:tr = "<tr><td>%s</td><td>%s</td> <td>%s</td></tr>" % (user["id"], user["name"], user["password"])tr_list.append(tr)with open("user_list.html", "r", encoding="utf-8") as f:data = f.read()data = data.replace("@@body@@", "".join(tr_list))return datadef user_list_new(request):from jinja2 import Templateconn = pymysql.connect(host="127.0.0.1",port=3306,user="root",password="123",database='day54',)cursor = conn.cursor(pymysql.cursors.DictCursor)cursor.execute("select id,name,password from user_info;")user_list = cursor.fetchall()# for user in user_list:cursor.close()conn.close()print(user_list)with open("user_list_new.html", "r", encoding="utf-8") as f:data = f.read()template = Template(data)response = template.render(user_list=user_list)return responseurls = [("/index", index),("/login", login),("/time", time),("/user_list", user_list),("/user_list_new", user_list_new),]def run():sock = socket.socket()sock.bind(("127.0.0.1", 8080))sock.listen(5)while True:conn, port = sock.accept()# 接收请求信息data = conn.recv(1024)print(data)# data=str(data,encoding='utf-8')data = data.decode("utf-8")# b'GET / HTTP/1.1\r\nHost: 127.0.0.1:8080\r\n# Connection: keep-alive\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.5944.400 LBBROWSER/10.1.3378.400\r\nUpgrade-Insecure-Requests: 1\r\n# Accept: text//html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\nAccept-Encoding: gzip, deflate, br\r\n# Accept-Language: zh-CN,zh;q=0.9\r\n\r\n'# 分割每条信息request_list = data.split("\r\n\r\n")head_list = request_list[0].split("\r\n")method, url, http = head_list[0].split(' ')conn.send(b"HTTP/1.1 200 OK\r\n\r\n")print(url)func_name = Nonefor u in urls:if url == u[0]:func_name = u[1]breakif func_name:response = func_name(data)else:response = "404 not found"conn.send(response.encode("utf-8"))conn.close()if __name__ == '__main__':run()
login.html<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Title</title></head><body><form action=""><p>用户名:<input type="text"></p><p>密码:<input type="password"></p></form></body></html>
time.html
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Title</title></head><body>@@time@@</body></html>

user_list.html

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>用户列表</title></head><body><table border="1"><thead><tr><th>id</th><th>用户名</th><th>密码</th></tr></thead><tbody>@@body@@</tbody></table></body></html>

user_list_new.html

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>用户列表</title></head><body><table border="1"><thead><tr><th>id</th><th>name</th><th>password</th></tr></thead><tbody>{% for user in user_list%}<tr><td>{{user.id}}</td><td>{{user.name}}</td><td>{{user.password}}</td></tr>{%endfor%}</tbody></table></body></html>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: