zoukankan      html  css  js  c++  java
  • django

      

     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
    
    ')
        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()
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>index</title>
    </head>
    <body>
    <h1>这是index页面</h1>
    </body>
    </html>
    index.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <h1>当前时间是:@@time@@</h1>
    </body>
    </html>
    timer.html

    使用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_server
    from jinja2 import Template
    
    
    def 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()
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="x-ua-compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1">
      <title>Title</title>
    </head>
    <body>
        <h1>姓名:{{name}}</h1>
        <h1>爱好:</h1>
        <ul>
            {% for hobby in hobby_list %}
            <li>{{hobby}}</li>
            {% endfor %}
        </ul>
    </body>
    </html>
    index2.html

    从数据库中查询数据,来填充页面(和上面的jinja2模板渲染基本一样,只是简单的引用了数据库的数据)

    import pymysql
    from wsgiref.simple_server import make_server
    from jinja2 import Template
    
    
    conn = 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的表现有些区别

        <script>
            //不知道为什么这段jquery代码不能像js,css一样放在static静态文件中
            $(function () {
                $('#register').click(
                    function (event) {
                        {#$(window).attr('location', '../register'); //这里一定要是../register,不能直接用register.html(但是当使用sublime打开时就要写register.html,这是因为使用pycharm时会使用local作为服务端,还有端口号,这时改变链接改变的是路由)#}
                        $(window).attr('location', '/register/'); //这样也可以,推荐这样写,/register/ 没有 '/'只写register是字符串拼接,在当前的页面地址后拼接register,这样是找不到的
                        // $(window).attr('location','register.html');   //使用sublime运行时要这样写
                        return false
                    }
                )
            })
        </script>

    pycharm定位py文件小技巧

  • 相关阅读:
    存储过程加密
    sql 指删除表,改表名,改字段名
    windows 2003 server 64 位 IIS 6下部署 32位网站
    linux查看内存的使用占比
    linux查看端口是否被占用
    ERROR 2002 (HY000): Can't connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock' (2)
    mysql数据库的备份(mysqldump)和恢复(source)
    linux解压压缩文件zip/tar/tar.gz命令汇总
    oracle数据库的备份和导入数据
    oracle 备份表数据
  • 原文地址:https://www.cnblogs.com/perfey/p/9588479.html
Copyright © 2011-2022 走看看