• 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
    
            Host: 127.0.0.1:8080
    
            Connection: keep-alive
    
            Cache-Control: max-age=0
    
            Upgrade-Insecure-Requests: 1
    
            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
    
            Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
    
            Accept-Encoding: gzip, deflate, br
    
            Accept-Language: zh-CN,zh;q=0.9
    
            
    
        '
        '''
        # 发送消息
        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
    
    <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
    
    <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
    
    <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
    
    ')
        # 根据不同的请求路径返回不同的内容
        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
    
    ')
        # 根据不同的请求路径返回不同的内容
        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


  • 相关阅读:
    Windows 7 语音识别和屏幕录像
    用户体验研究乱谈后台导航
    安装VS2010
    lucene.net搜索索引详解
    网站秒杀那点破事
    初次给鼠标手术
    网站页面回车和鼠标焦点
    利用C语言的部分初始化特性进行字符串的全部初始化。
    QoS的各个方面
    指针和数组错用的问题汇总
  • 原文地址:https://www.cnblogs.com/lilyxiaoyy/p/11208602.html
Copyright © 2020-2023  润新知