http的请求格式和响应格式
对应着
一个请求的完整的流程:
1. web服务要启动,等待连接;
2. 在浏览器地址栏中输入URL,回车。向服务器发送一个遵循HTTP协议的GET请求。 3. 服务器收到请求,按照HTTP协议去解析请求。拿到到URL,找到对应的函数。 4. 函数中处理HTML代码,进行字符串的替换。拿到一个新的字符串。 5. 服务器把响应体按照HTTP响应的格式组装起来返回给浏览器。 6. 浏览器接收到数据,拿到响应体渲染。 7. 断开连接。
django目录结构
使用socket写的简单的web服务端,浏览器访问不同的路由响应不同的html
# 导入模块import socket# 创建一个socket对象sk = socket.socket()# 绑定IP和端口sk.bind(('127.0.0.1',8000))# 监听sk.listen()def timer(url): import time with open('time.html','r',encoding='utf-8') as f: ret = f.read() ret = ret.replace('@@time@@',time.strftime("%Y-%m-%d %H:%M:%S")) return ret.encode('utf-8')def index(url): with open('index.html','rb') as f: return f.read()def oumei(url): return b'welcome to oumei bankuai'def rihan(url): return b'welcome to rihan bankuai'def dongnanya(url): return b'welcome to dongnanya bankuai'# 定义一个URL和函数的对应函数list1 = [ ('/oumei/',oumei), ('/rihan/',rihan), ('/dongnanya/',dongnanya), ('/index/',index), ('/time/',timer),]while True: # 等待连接 conn, addr = sk.accept() # 接收消息 data = conn.recv(8000) url = data.decode('utf-8').split()[1] # 发送消息 conn.send(b'HTTP/1.1 200 OK\r\n\r\n') func = None for i in list1: if i[0] == url: func = i[1] break if func: response = func(url) else: response = b'404 not found' # 返回信息 conn.send(response) # 关闭连接 conn.close()
index 这是index页面
Title 当前时间是:@@time@@
使用wsgiref模块实现上面的功能(封装了socket,不再使用socket)
from wsgiref.simple_server import make_server# 将返回不同的内容部分封装成函数def index(url): # 读取index.html页面的内容 with open("index.html", "r", encoding="utf8") as f: s = f.read() # 返回字节数据 return bytes(s, encoding="utf8")def home(url): with open("home.html", "r", encoding="utf8") as f: s = f.read() return bytes(s, encoding="utf8")def timer(url): import time with open("time.html", "r", encoding="utf8") as f: s = f.read() s = s.replace('@@time@@', time.strftime("%Y-%m-%d %H:%M:%S")) return bytes(s, encoding="utf8")# 定义一个url和实际要执行的函数的对应关系list1 = [ ("/index/", index), ("/home/", home), ("/time/", timer),]def run_server(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html;charset=utf8'), ]) # (替代socket发送响应头)设置HTTP响应的状态码和头信息 url = environ['PATH_INFO'] # 取到用户输入的url func = None for i in list1: if i[0] == url: func = i[1] break if func: response = func(url) else: response = b"404 not found!" return [response, ]if __name__ == '__main__': httpd = make_server('127.0.0.1', 8090, run_server) print("我在8090等你哦...") httpd.serve_forever()
使用 jinja2 进行模板渲染,把后端的数据直接给前端(不像上面的两个例子是通过字符串替换实现的)
from wsgiref.simple_server import make_serverfrom jinja2 import Templatedef index(url): # 读取HTML文件内容 with open("index2.html", "r", encoding="utf8") as f: data = f.read() template = Template(data) # 生成模板文件 ret = template.render({ 'name': 'egon', 'hobby_list': ['街舞', '喝酒', '烫头']}) # 把数据填充到模板中 return bytes(ret, encoding="utf8")def home(url): with open("home.html", "r", encoding="utf8") as f: s = f.read() return bytes(s, encoding="utf8")# 定义一个url和实际要执行的函数的对应关系list1 = [ ("/index/", index), ("/home/", home),]def run_server(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html;charset=utf8'), ]) # 设置HTTP响应的状态码和头信息 url = environ['PATH_INFO'] # 取到用户输入的url func = None for i in list1: if i[0] == url: func = i[1] break if func: response = func(url) else: response = b"404 not found!" return [response, ]if __name__ == '__main__': httpd = make_server('127.0.0.1', 8090, run_server) print("我在8090等你哦...") httpd.serve_forever()
Title 姓名:{ {name}}
爱好:
- {% for hobby in hobby_list %}
- { {hobby}} {% endfor %}
从数据库中查询数据,来填充页面(和上面的jinja2模板渲染基本一样,只是简单的引用了数据库的数据)
import pymysqlfrom wsgiref.simple_server import make_serverfrom jinja2 import Templateconn = pymysql.connect(host="127.0.0.1", port=3306, user="root", passwd="123", db="db5", charset="utf8")cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)cursor.execute("select id,name,age from user")user_list = cursor.fetchall()print(user_list)cursor.close()conn.close()def index(url): # 读取HTML文件内容 with open("index2.html", "r", encoding="utf8") as f: data = f.read() template = Template(data) # 生成模板文件 ret = template.render({ 'name': user_list[0]['name'], 'hobby_list': [user_list[0]['id'], user_list[0]['name'], user_list[0]['age']]}) # 把数据填充到模板中 return bytes(ret, encoding="utf8")def home(url): with open("home.html", "r", encoding="utf8") as f: s = f.read() return bytes(s, encoding="utf8")# 定义一个url和实际要执行的函数的对应关系list1 = [ ("/index/", index), ("/home/", home),]def run_server(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html;charset=utf8'), ]) # 设置HTTP响应的状态码和头信息 url = environ['PATH_INFO'] # 取到用户输入的url func = None for i in list1: if i[0] == url: func = i[1] break if func: response = func(url) else: response = b"404 not found!" return [response, ]if __name__ == '__main__': httpd = make_server('127.0.0.1', 8090, run_server) print("我在8090等你哦...") httpd.serve_forever()
数据库
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
form 表单中标签属性
redirect 重定向的本质
django中创建app的三种方式(app是创建一个文件夹,在这个文件夹里我们写某一块功能比如登录界面,这样当我们的项目大了之后不会太乱)
1.命令行创建(在manage.py的同级目录下输入,在pycharm的Terminal可直接进入这个目录) python manage.py startapp login
2.使用pycharm辅助,如下图所示打开manage.py@mysite 输入框,然后直接输命令就行了,不用再输python manage.py 了
3.创建django时创建app
app的目录结构
在django中引用数据库
1.setting文件配置mysql数据库(首先要创建数据库day66,可以使用cmd中的create database day66)
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 引擎 'NAME': 'day66', # 数据库名 'USER':'root', # 用户名 'PASSWORD':'', # 密码 'HOST':'127.0.0.1', # IP 'PORT': 3306, # 端口号 } }
2. 在与settings.py同级目录下的__init__.py文件中写:
import pymysql pymysql.install_as_MySQLdb()3.创建表,这里是使用ORM 创建的
在app中的models.py中写类
class Userinfo(models.Model): user = models.CharField(max_length=32) # varchar(32) pwd = models.CharField(max_length=32)ORM 中的类对应数据库的某个表,对象对应数据库中的记录,对象属性对应数据库中的字段 ,是个映射关系
4. 执行两条命令:
python manage.py makemigrations # 把models.py的变化记录下来 python manage.py migrate # 去修改你的数据库
ORM操作命令
from login import models
1. 获取数据表所有内容 all = models.Userinfo.objects.all() 2. 获取一条数据 models.Userinfo.objects.get(user='alex') # 没有数据或者多条数据就报错 3. 向数据库插入一条数据 models.Userinfo.objects.create(user='alex',pwd='alexdsb')
pycharm中html和sublime中的html的表现有些区别
pycharm定位py文件小技巧