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


posted on 2019-07-18 17:13  lilyxiaoyy  阅读(209)  评论(0编辑  收藏  举报

返回
顶部