web框架django第一天
浏览器作为客户端与socket服务端通讯
# -*- coding: utf-8 -*-
import socket
# 创建套接字
sk = socket.socket()
# 地址和端口绑定
sk.bind(('127.0.0.1', 8080))
# 监听
sk.listen()
# 等待连接
while 1:
conn, addr = sk.accept()
# 接收浏览器发送的消息
browser_msg = conn.recv(1024)
# 打印浏览器发来的消息
print(browser_msg)
'''
b'
GET / HTTP/1.1\r\n
Host: 127.0.0.1:8080\r\n
Connection: keep-alive\r\n
Cache-Control: max-age=0\r\n
Upgrade-Insecure-Requests: 1\r\n
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3\r\n
Accept-Encoding: gzip, deflate, br\r\n
Accept-Language: zh-CN,zh;q=0.9\r\n
\r\n
'
'''
# 发送消息
conn.send(b'ok')
# 关闭连接
conn.close()
HTTP协议
### HTTP请求方法
* GET
* POST
* HEAD
* DELETE
* TRACE
* CONNECT
* PUT
* OPTIONS
### HTTP状态码
* 1xx消息
* 2xx成功
* 3xx重定向
* 4xx请求错误
* 5xx服务器错误
### HTTP请求格式
* 请求行
* 请求方法 URL 协议版本
* 请求头
* 头部字段名:值
* 请求数据
### HTTP响应格式
* 响应行
* 协议版本 状态码 状态码描述
* 响应头
* 头部字段名:值
* 响应数据
根据HTTP响应格式返回数据
# -*- coding: utf-8 -*-
import socket
# 创建套接字
sk = socket.socket()
# 绑定IP和端口
sk.bind(('127.0.0.1', 8080))
# 监听
sk.listen()
# 等待连接
while 1:
conn, addr = sk.accept()
# 接收数据
data = conn.recv(1024)
# 根据HTTP响应格式返回数据
conn.send(b'HTTP/1.1 200 OK\r\n\r\n<h1>ok</h1>')
# 关闭连接
conn.close()
根据不同的请求路径返回不同的内容
# -*- coding: utf-8 -*-
import socket
# 创建套接字
sk = socket.socket()
# 绑定IP和端口
sk.bind(('127.0.0.1', 8080))
# 监听
sk.listen()
# 等待连接
while 1:
conn, addr = sk.accept()
# 接收数据
data = conn.recv(1024)
request_url = data.decode('utf-8').split()[1]
print(request_url)
conn.send(b'HTTP/1.1 200 OK\r\n\r\n<h1>')
# 根据不同的请求路径返回不同的内容
response_data = b''
if request_url == '/index':
response_data = b'index'
elif request_url == '/home':
response_data = b'home'
else:
response_data = b'404 Not found!'
# 返回数据
conn.send(response_data+b'</h1>')
# 关闭连接
conn.close()
函数版
# -*- coding: utf-8 -*-
import socket
# 创建套接字
sk = socket.socket()
# 绑定IP和端口
sk.bind(('127.0.0.1', 8080))
# 监听
sk.listen()
# 函数版
def response_fun(request_url):
response_str = '这是%s页面' % request_url
return response_str.encode('gbk')
# 等待连接
while 1:
conn, addr = sk.accept()
# 接收数据
data = conn.recv(1024)
request_url = data.decode('utf-8').split()[1]
print(request_url)
conn.send(b'HTTP/1.1 200 OK\r\n\r\n<h1>')
# 根据不同的请求路径返回不同的内容
response_data = b''
if request_url == '/index':
response_data = response_fun(request_url)
elif request_url == '/home':
response_data = response_fun(request_url)
else:
response_data = b'404 Not found!'
# 返回数据
conn.send(response_data+b'</h1>')
# 关闭连接
conn.close()
返回不同的html文件内容
# -*- coding: utf-8 -*-
import socket
# 创建套接字
sk = socket.socket()
# 绑定IP和端口
sk.bind(('127.0.0.1', 8080))
# 监听
sk.listen()
# 返回不同的html文件内容
def index():
with open('index.html', 'rb') as f:
response_data = f.read()
return response_data
def home():
with open('home.html', 'rb') as f:
response_data = f.read()
return response_data
request_list = [
('/index', index),
('/home', home)
]
# 等待连接
while 1:
conn, addr = sk.accept()
# 接收数据
data = conn.recv(1024)
request_url = data.decode('utf-8').split()[1]
print(request_url)
conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
# 根据不同的请求路径返回不同的内容
func = None
for item in request_list:
if item[0] == request_url:
func = item[1]
print(func)
break
if func:
response_data = func()
else:
response_data = b'<h1>404 Not found!</h1>'
# 返回数据
conn.send(response_data)
# 关闭连接
conn.close()
让页面动态起来
# -*- coding: utf-8 -*-
import socket
import time
# 创建套接字
sk = socket.socket()
# 绑定IP和端口
sk.bind(('127.0.0.1', 8080))
# 监听
sk.listen()
# 返回不同的html文件内容
def index():
with open('index.html', 'rb') as f:
response_data = f.read()
return response_data
def home():
with open('home.html', 'rb') as f:
response_data = f.read()
return response_data
# 让页面动态起来
def timer():
with open('timer.html', 'r', encoding='utf-8') as f:
response_data = f.read()
response_data = response_data.replace('@@timer@@', time.strftime('%Y-%m-%d %H:%M:%S'))
return response_data.encode('utf8')
request_list = [
('/index', index),
('/home', home),
('/timer', timer),
]
# 等待连接
while 1:
conn, addr = sk.accept()
# 接收数据
data = conn.recv(1024)
request_url = data.decode('utf-8').split()[1]
print(request_url)
conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
# 根据不同的请求路径返回不同的内容
func = None
for item in request_list:
if item[0] == request_url:
func = item[1]
print(func)
break
if func:
response_data = func()
else:
response_data = b'404 Not found!'
# 返回数据
conn.send(response_data)
# 关闭连接
conn.close()
###WSGI(Web Server Gateway Interface)
就是一种规范,它定义了使用Python编写的web应用程序与web服务器程序之间的接口格式,
实现web应用程序与web服务器程序间的解耦。
常用的WSGI服务器有uWSGI、Gunicorn。而Python标准库提供的独立WSGI服务器叫wsgiref,
Django开发环境用的就是这个模块来做服务器。
###ORM对象关系映射(object relational mapping)
* 概念
* 通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。
* 优势
* ORM解决的主要问题是对象和关系的映射。它通常将一个类和一张表一一对应,类的每个实例对应表中的一条记录,
类的每个属性对应表中的每个字段。
* ORM提供了对数据库的映射,不用直接编写SQL代码,只需操作对象就能对数据库操作数据。
* 让软件开发人员专注于业务逻辑的处理,提高了开发效率。
* 劣势
* ORM的缺点是会在一定程度上牺牲程序的执行效率。
* ORM的操作是有限的,也就是ORM定义好的操作是可以完成的,一些复杂的查询操作是完成不了。
* ORM用多了SQL语句就不会写了,关系数据库相关技能退化
###创建数据库
* create database day14
###Django项目使用MySQL数据库
* mysite/settings.py文件配置数据库连接信息
```python
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 引擎
'NAME': 'day14', # 数据库名
'HOST': '127.0.0.1', # 数据库IP地址
'PORT': 3306, # 数据库端口号
'USER': 'root', # 数据库用户名
'PASSWORD': '666' # 数据库密码
}
}
```
* mysite项目下的mysite/__init__.py 添加如下内容
* 告诉Django使用pymysql模块连接MySQL数据库
```python
import pymysql
pymysql.install_as_MySQLdb()
```
* 对象映射关系
* 类<--->数据表
* 对象<--->数据行
* 属性<--->数据列(字段)
###创建表mysite/models.py
```python
from django.db import models
# Create your models here.
class UserInfo(models.Model):
username = models.CharField(max_length=32)
password = models.CharField(max_length=32)
```
* 创建迁移文件 python manage.py makemigrations
* 执行迁移数据库 python manage.py migrate
###报错
```python
WARNINGS:
?: (mysql.W002) MySQL Strict Mode is not set for database connection 'default'
HINT: MySQL's Strict Mode fixes many data integrity problems in MySQL, such as data truncation upon insertion, by escalating warnings into errors. It is
strongly recommended you activate it. See: https://docs.djangoproject.com/en/2.2/ref/databases/#mysql-sql-mode
```
* 在配置中多加一个OPTIONS参数
```python
'OPTIONS': {
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"},
```
###数据表操作
* 增
```python
models.UserInfo.objects.create(
username=username,
password=md5_pwd,
gender=gender,
age=age,
email=email,
phone=phone,
userType=userType,
createDateTime=createDateTime
)
```
* 删
```python
models.UserInfo.objects.filter(id=user_id).delete()
```
* 改
```python
models.UserInfo.objects.filter(id=user_id).update(
username=new_name,
password=md5_new_pwd,
gender=new_gender,
age=new_age,
email=new_email,
phone=new_phone,
userType=new_userType
)
```
* 查
```python
models.UserInfo.objects.filter(username=username, password=md5_pwd) # 根据多个条件查
models.UserInfo.objects.filter(username=usr) # 根据一个条件查
models.UserInfo.objects.all() # 查所有数据
models.UserInfo.objects.exclude(id=exclude_id).filter(username=username) # 排除+过滤查询
```
老师博客地址: https://www.cnblogs.com/maple-shaw/p/8862330.html
https://www.cnblogs.com/maple-shaw/p/9029086.html
https://www.cnblogs.com/maple-shaw/articles/9323320.html