zoukankan      html  css  js  c++  java
  • python dgango简介 安装 多表查询

    一.socket服务器

    import socket
    sk=socket.socket()
    sk.bind(("127.0.0.1",8890))
    sk.listen()
    
    while True:
        conn, addr = sk.accept()
        data=conn.recv(8800)
        print(data.decode("utf-8"))
        conn.send(b'HTTP/1.1 200 OK
    
    ')
        conn.send(b'ok')
    
    conn.close()
    sk.close()
    

    二.根据不同路径返回不同内容

    import socket
    sk=socket.socket()
    sk.bind(("127.0.0.1",8877))
    sk.listen()
    
    conn,addr = sk.accept()
    # 接收数据data
    data=conn.recv(8800)
    # 取到路径
    url=data.decode('utf-8').split()[1]
    print(url)
    
    conn.send(b'HTTP/1.1 200 OK
    
    ')
    if url=="/index/":
        response=b'index'
    elif url=='/home/':
        response=b'home'
    else:
        response=b'sorry there is nothing you want'
    conn.send(response)
    conn.close()
    sk.close()
    

     三.根据不同路径返回不同内容函数版

    import socket
    sk=socket.socket()
    sk.bind(('127.0.0.1',8888))
    sk.listen()
    def oumei(url):
        return b'welcome to oumei mokuai'
    
    
    def rihan(url):
        return b'welcome to rihan mokuai'
    
    while True:
        conn,addr=sk.accept()
        data=conn.recv(8800)
        print(data)
        url=data.decode('utf8').split()[1]
        conn.send(b'HTTP/1.1 200 OK
    
    ')
        if url =='/oumei/':
            response=oumei(url)
        elif url =='/rihan/':
            response=rihan(url)
        else:
            response=b'there is nothing'
        conn.send(response)
        conn.close()
    

    四.不同路径返回不同内容函数进阶版

    import socket
    sk=socket.socket()
    sk.bind(('127.0.0.1',8892))
    sk.listen()
    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)
    ]
    while True:
        conn,addr=sk.accept()
        data=conn.recv(8877)
        url=data.decode('utf8').split()[1]
        conn.send(b'HTTP/1.1 200 OK
    
    ')
        # 定义一个函数变量等于none
        func=None
        # 循环列表的每一项
        for i in list1:
            # 如果列表中每一项的第一个内容等于获取的数据url,则找到该url相对应的函数名
            if i[0]==url:
                func=i[1]
                break
        # 如果函数名存在则返回函数执行结果赋值给response
        if func:
            response=func(url)
        # 如果不存在则返回下面的内容
        else:
            response=b'there is nothing'
        #给客户端响应response
        conn.send(response)
        conn.close()
    

    五.HTML 版

    import socket
    sk=socket.socket()
    sk.bind(('127.0.0.1',8898))
    sk.listen()
    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'
    list1=[
        ('/oumei/',oumei),
        ('/rihan/',rihan),
        ('dongnanya/',dongnanya),
        ('/index/',index)
    ]
    while True:
        conn,addr=sk.accept()
        data=conn.recv(8899)
        url=data.decode('utf8').split()[1]
        conn.send(b'HTTP/1.1 200 OK
    
    ')
        func=None
        for i in list1:
            if i[0]==url:
                func=i[1]
        if func:
            response=func(url)
        else:
            response=b'404 not found'
        conn.send(response)
        conn.close()
    html:
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>index</title>
    </head>
    <body>
    <h1>这是index页面</h1>
    </body>
    </html>  

    六.动态版  

     

    import socket
    import time
    sk=socket.socket()
    sk.bind(('127.0.0.1',9901))
    sk.listen()
    def timer(url):
        with open('time.html','r',encoding='utf-8')as f:
            # 读取time.html中的内容
            ret=f.read()
            # 将原文件中的@@time@@替换成当前时间的时间字符串格式并重新赋值给ret
            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()

    time.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    </head>
    <body>
    <h1>当前时间是:@@time@@</h1>
    </body>
    </html>
    七.wsgi版
    from wsgiref.simple_server import make_server
    # 将返回不同的内容部分封装成函数
    
    def index(url):
        with open("index.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),
    
        ("/time/",timer),
    ]
    # 好戏要来了
    def run_server(environ,start_response):
        start_response("200 OK",[("Content-Type","text/html;charset=utf8")])
        url=environ['PATH_INFO']
        func=None
        for i in list1:
            if i[0]==url:
                func=i[1]
        if func:
            response=func(url)
        else:
            response=b'404 not found!'
        return [response,]
    if __name__=='__main__':
        httpd=make_server("127.0.0.1",9902,run_server)
        print("我在9902等你o.....")
        httpd.serve_forever()
    
        """
        相关词汇:
        wsgiref.simple_server     make_server
        def run_server函数
        参数(environ,start_response);
        start_response("状态码 状态描述",[("Content-Type","text/html;charset=utf8"),()]
        environ['PATH_INFO']
        ...
        return [response,]
        if __name__ == '__main__':
        httpd = make_server('127.0.0.1', 8090, run_server)
        
        print()检测
        httpd.serve_forever()
        """
    

     八.模板渲染

    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")
    
    
    list1 = [
        ("/index/", index),
    
    ]
    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', 9903, run_server)
        print("我在9903等你哦...")
        httpd.serve_forever()

    index2.html
    <!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>

    小结:

    1. HTTP协议

    1. 请求(浏览器发送给服务器的消息-request)
    格式:
    请求方式 URL 协议版本
    k1: v1
    k2: v2

    请求数据(请求体)

    2. 响应(服务器返回给浏览器的消息-response)
    格式:
    协议版本 状态码 状态描述符
    k1: v1
    k2: v2

    响应体(HTML)


    2. web框架
    本质: socket服务端

    功能:
    a. socket收发消息
    b. URL和函数的对应关系,根据不同的URL执行不同的函数,返回函数的结果
    c. 读取HTML文件,进行了一个字符替换(模板渲染)

    分类:
    Django flask tornado
    完成了a,b,c三个功能的 ——》 tornado
    完成了b,c 两个功能 ——》 Django
    完成了b 一个功能 ——》 flask

    另一种分类:
    1. Django 大而全
    2. 其他 短小精悍
    九.

    (一).安装django

    1. pycharm
      file settings project 点加号 输入django 选择版本 下载

    2.命令行

      pip install django===1.11.15

      pip install -i 源 django==1.11.15

    (二).创建Django项目
    1. pycharm

      file ——》 new project ——》 django ——》 项目名 ——》选择解释器 ——》create
    2. 命令行
    django-admin startproject 项目名
    (三).启动项目

    1. 命令行
    切换到有manage.py的目录下
    python manage.py runserver # 127.0.0.1:8000
    python manage.py runserver 80 # 127.0.0.1:80
    python manage.py runserver 0.0.0.0:80 # 0.0.0.0:80

    2. pycharm

    配置好 点绿色三角

    (四)创建APP   注册APP

    1.pycharm

      tools ——> run manage.py task ——> startapp app01

    2.命令

      python manage.py startapp app01

    3.注册app

      在settings.py 中的INSTALLED_APPS 写:

      'app名'  或者以下

      'APP名.apps.App名Config'

    (五)配置文件
    1.静态文件
      STATIC_URL = '/static/' # 别名
      STATICFILES_DIRS = [
          os.path.join(BASE_DIR, 'static')
      ]

    2. TEMPLATES 模板 HTML文件 

       DIRS [os.path.join(BASE_DIR, 'templates')]

    3.注释csrf中间件(暂时)

    4.数据库的配置

    DATABASES = {
      'default': {
         'ENGINE': 'django.db.backends.mysql', # 引擎
         'NAME': 'day66', # 数据库名
         'USER':'root', # 用户名
         'PASSWORD':'', # 密码
         'HOST':'127.0.0.1', # IP
         'PORT': 3306, # 端口号
          }
       }

    (六)URL和函数的对应关系 ——> urls.py  

      from app名 import views

       urlpatterns = [
          url(r'^admin/', admin.site.urls),
          url(r'^login/', views.login),
          url(r'^index/', views.index),
          url(r'^test/', views.test)
       ]

    (七).使用MySQL数据

        1.创建一个数据库

        2.settings的配置

        3.告诉Django使用pymysql模块连接数据库 

            在 settings.py 同级目录下的__init__.py 中写:

            import pymysql 

            pymysql.install_as_MySQLdb()

        4.建表

          在app 下的models.py 中写类(继承models.Model)

        5.执行数据库迁移命令

            python manage.py makemigrations    记录modls.py中类是不是发生变化,将变化记录下来  

            python manage.py migrate    将model的变更同步到数据库中

    (八)ORM 

      对象和关系型数据库的映射    通过操作对象的方式来操作数据库

      映射关系:

          类  ------数据表

          对象-----数据行

          属性-----字段

      ORM 能做的事:

        操作数据表

        操作数据行

      ORM 操作:

        from 项目名 import models

        获取所有数据

        models.类名.objects.all()

        获取一条数据  (获取不到或获取到多条数据时会报错)

        models.类名.objects.get(user='alex',pwd='123)

        创建一条数据

        models.类名.objects.create(user='alex',pwd='123)

    (j九) form表单

      1.method='post'  请求方式  提交数据的地址

      2.所有的input的标签要有name属性

      3.有一个input的type='submit' 或者有一个button按钮  

    (十)GET 和POST

      GET 获取一个页面路径后?key1=v1&key2=v2

      POST  提交数据

    (十一)views.py写函数

      request 跟请求相关的所有内容

         request.method  字符串  (GET/ POST)

         request.POST   POST请求提交的数据  字典

         request.GET     GET 请求提交的数据

      返回值 from django.shortcuts import HttpResponse,render,redirect

           HttpResponse(''字符串'')   页面显示的就是'字符串

           render(request,'模板文件名',{ 渲染动态数据})  渲染你的HTML文件返回给浏览器

           redirect('/要跳转的URL/')      重定向  告诉浏览器再向URL再发一次GET请求

     

      

  • 相关阅读:
    AngularJS启动过程分析
    mongodb 基本用法大全
    bitbucket工程改名导致 repository does not exist. fatal: Could not read from remote repository.
    分散的配置文件VS集中的注册表
    让browserify接收命令行参数,在打包时parse yml配置文件
    vscode下ts-node传入cli参数
    d3 .each()
    d3选择全部子节点,不知道class和id
    d3 parse字符串形式的xml svg and append to element
    在浏览器端用es6,babel+browserify打包
  • 原文地址:https://www.cnblogs.com/J-7-H-2-F-7/p/9588595.html
Copyright © 2011-2022 走看看