一.socket服务器

  1. import socket
  2. sk=socket.socket()
  3. sk.bind(("127.0.0.1",8890))
  4. sk.listen()
  5.  
  6. while True:
  7. conn, addr = sk.accept()
  8. data=conn.recv(8800)
  9. print(data.decode("utf-8"))
  10. conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
  11. conn.send(b'ok')
  12.  
  13. conn.close()
  14. sk.close()

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

  1. import socket
  2. sk=socket.socket()
  3. sk.bind(("127.0.0.1",8877))
  4. sk.listen()
  5.  
  6. conn,addr = sk.accept()
  7. # 接收数据data
  8. data=conn.recv(8800)
  9. # 取到路径
  10. url=data.decode('utf-8').split()[1]
  11. print(url)
  12.  
  13. conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
  14. if url=="/index/":
  15. response=b'index'
  16. elif url=='/home/':
  17. response=b'home'
  18. else:
  19. response=b'sorry there is nothing you want'
  20. conn.send(response)
  21. conn.close()
  22. sk.close()

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

  1. import socket
  2. sk=socket.socket()
  3. sk.bind(('127.0.0.1',8888))
  4. sk.listen()
  5. def oumei(url):
  6. return b'welcome to oumei mokuai'
  7.  
  8. def rihan(url):
  9. return b'welcome to rihan mokuai'
  10.  
  11. while True:
  12. conn,addr=sk.accept()
  13. data=conn.recv(8800)
  14. print(data)
  15. url=data.decode('utf8').split()[1]
  16. conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
  17. if url =='/oumei/':
  18. response=oumei(url)
  19. elif url =='/rihan/':
  20. response=rihan(url)
  21. else:
  22. response=b'there is nothing'
  23. conn.send(response)
  24. conn.close()

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

  1. import socket
  2. sk=socket.socket()
  3. sk.bind(('127.0.0.1',8892))
  4. sk.listen()
  5. def oumei(url):
  6. return b'welcome to oumei bankuai'
  7.  
  8. def rihan(url):
  9. return b'welcome to rihan bankuai'
  10.  
  11. def dongnanya(url):
  12. return b'welcome to dongnanya bankuai'
  13. # 定义一个url和对应的函数的列表
  14. list1=[
  15. ('/oumei/',oumei),
  16. ('/rihan/',rihan),
  17. ('/dongnanya/',dongnanya)
  18. ]
  19. while True:
  20. conn,addr=sk.accept()
  21. data=conn.recv(8877)
  22. url=data.decode('utf8').split()[1]
  23. conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
  24. # 定义一个函数变量等于none
  25. func=None
  26. # 循环列表的每一项
  27. for i in list1:
  28. # 如果列表中每一项的第一个内容等于获取的数据url,则找到该url相对应的函数名
  29. if i[0]==url:
  30. func=i[1]
  31. break
  32. # 如果函数名存在则返回函数执行结果赋值给response
  33. if func:
  34. response=func(url)
  35. # 如果不存在则返回下面的内容
  36. else:
  37. response=b'there is nothing'
  38. #给客户端响应response
  39. conn.send(response)
  40. conn.close()

五.HTML 版

  1. import socket
  2. sk=socket.socket()
  3. sk.bind(('127.0.0.1',8898))
  4. sk.listen()
  5. def index(url):
  6. with open('index.html',"rb" )as f:
  7. return f.read()
  8.  
  9. def oumei(url):
  10. return b'welcome to oumei bankuai'
  11.  
  12. def rihan(url):
  13. return b'welcome to rihan bankuai'
  14.  
  15. def dongnanya(url):
  16. return b'welcome to dongnanya bankuai'
  17. list1=[
  18. ('/oumei/',oumei),
  19. ('/rihan/',rihan),
  20. ('dongnanya/',dongnanya),
  21. ('/index/',index)
  22. ]
  23. while True:
  24. conn,addr=sk.accept()
  25. data=conn.recv(8899)
  26. url=data.decode('utf8').split()[1]
  27. conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
  28. func=None
  29. for i in list1:
  30. if i[0]==url:
  31. func=i[1]
  32. if func:
  33. response=func(url)
  34. else:
  35. response=b'404 not found'
  36. conn.send(response)
  37. conn.close()
    html:
  1. <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>index</title>
    </head>
    <body>
    <h1>这是index页面</h1>
    </body>
    </html>  

六.动态版  

 

  1. import socket
  2. import time
  3. sk=socket.socket()
  4. sk.bind(('127.0.0.1',9901))
  5. sk.listen()
  6. def timer(url):
  7. with open('time.html','r',encoding='utf-8')as f:
  8. # 读取time.html中的内容
  9. ret=f.read()
  10. # 将原文件中的@@time@@替换成当前时间的时间字符串格式并重新赋值给ret
  11. ret=ret.replace("@@time@@",time.strftime("%Y-%m-%d %H:%M:%S"))
  12. # 将新的内容进行编码并作为函数的返回值
  13. return ret.encode('utf-8')
  14. def index(url):
  15. with open('index.html','rb') as f:
  16. return f.read()
  17.  
  18. def oumei(url):
  19. return b'welcome to oumei bankuai'
  20.  
  21. def rihan(url):
  22. return b'welcome to rihan bankuai'
  23.  
  24. def dongnanya(url):
  25. return b'welcome to dongnanya bankuai'
  26.  
  27. # 定义一个URL和函数的对应函数
  28. list1 = [
  29. ('/oumei/',oumei),
  30. ('/rihan/',rihan),
  31. ('/dongnanya/',dongnanya),
  32. ('/index/',index),
  33. ('/time/',timer),
  34. ]
  35. while True:
  36. # 等待连接
  37. conn, addr = sk.accept()
  38. # 接收消息
  39. data = conn.recv(8000)
  40. url = data.decode('utf-8').split()[1]
  41. # 发送消息
  42. conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
  43. func = None
  44. for i in list1:
  45. if i[0] == url:
  46. func = i[1]
  47. break
  48. if func:
  49. response = func(url)
  50. else:
  51. response = b'404 not found'
  52.  
  53. # 返回信息
  54. conn.send(response)
  55. # 关闭连接
  56. conn.close()
  57.  
  58. time.html
  1. <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    </head>
    <body>
    <h1>当前时间是:@@time@@</h1>
    </body>
    </html>
    七.wsgi版
  1. from wsgiref.simple_server import make_server
  2. # 将返回不同的内容部分封装成函数
  3.  
  4. def index(url):
  5. with open("index.html","r",encoding="utf8")as f:
  6. s=f.read()
  7. return bytes(s,encoding="utf8")
  8.  
  9. def timer(url):
  10. import time
  11. with open("time.html", "r", encoding="utf8") as f:
  12. s = f.read()
  13. s = s.replace('@@time@@', time.strftime("%Y-%m-%d %H:%M:%S"))
  14. return bytes(s, encoding="utf8")
  15. # 定义一个url和实际要执行的函数的对应关系
  16. list1=[
  17. ("/index/",index),
  18.  
  19. ("/time/",timer),
  20. ]
  21. # 好戏要来了
  22. def run_server(environ,start_response):
  23. start_response("200 OK",[("Content-Type","text/html;charset=utf8")])
  24. url=environ['PATH_INFO']
  25. func=None
  26. for i in list1:
  27. if i[0]==url:
  28. func=i[1]
  29. if func:
  30. response=func(url)
  31. else:
  32. response=b'404 not found!'
  33. return [response,]
  34. if __name__=='__main__':
  35. httpd=make_server("127.0.0.1",9902,run_server)
  36. print("我在9902等你o.....")
  37. httpd.serve_forever()
  38.  
  39. """
  40. 相关词汇:
  41. wsgiref.simple_server make_server
  42. def run_server函数
  43. 参数(environ,start_response);
  44. start_response("状态码 状态描述",[("Content-Type","text/html;charset=utf8"),()]
  45. environ['PATH_INFO']
  46. ...
  47. return [response,]
  48. if __name__ == '__main__':
  49. httpd = make_server('127.0.0.1', 8090, run_server)
  50.  
  51. print()检测
  52. httpd.serve_forever()
  53. """

 八.模板渲染

  1. from wsgiref.simple_server import make_server
  2. from jinja2 import Template
  3.  
  4. def index(url):
  5. # 读取HTML文件内容
  6. with open("index2.html", "r", encoding="utf8") as f:
  7. data = f.read()
  8. template = Template(data) # 生成模板文件
  9. ret = template.render({'name': 'egon', 'hobby_list': ['街舞', '喝酒', '打豆豆']}) # 把数据填充到模板中
  10. return bytes(ret, encoding="utf8")
  11.  
  12. list1 = [
  13. ("/index/", index),
  14.  
  15. ]
  16. def run_server(environ, start_response):
  17. start_response('200 OK', [('Content-Type', 'text/html;charset=utf8'), ]) # 设置HTTP响应的状态码和头信息
  18. url = environ['PATH_INFO'] # 取到用户输入的url
  19. func = None
  20. for i in list1:
  21. if i[0] == url:
  22. func = i[1]
  23. break
  24. if func:
  25. response = func(url)
  26. else:
  27. response = b"404 not found!"
  28. return [response, ]
  29.  
  30. if __name__ == '__main__':
  31. httpd = make_server('127.0.0.1', 9903, run_server)
  32. print("我在9903等你哦...")
  33. httpd.serve_forever()
  34.  
  35. index2.html
  1. <!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请求

 

  

python dgango简介 安装 多表查询的更多相关文章

  1. python之路--MySQL多表查询

    一 介绍 我们在写项目的时候一般都会建一个数据库,数据库里面会存很多的表,不可能把所有的数据都放在一张表里,因为分表来存数据节省空间,数据的组织结构更清晰,解耦和程度更高,但是这些表本质上还不是一个整 ...

  2. python之路--MySQl单表查询

    一.  关键字的执行优先级(重点) from where group by having # 使用是要放在group by 后面而且前面必须有group by select distinct # 去重 ...

  3. python 之 数据库(多表查询之连接查询、子查询、pymysql模块的使用)

    10.10 多表连接查询 10.101 内连接 把两张表有对应关系的记录连接成一张虚拟表 select * from emp,dep: #连接两张表的笛卡尔积 select * from emp,de ...

  4. Mybatis多表查询出现null字段

    写在前面 今天使用mybatis实现多表查询,记录一下其中遇到的坑 mybatis多表查询简介 mybatis多表查询主要有两个方式,通俗易懂的来说就是一个是查询少量属性(association),一 ...

  5. Python 3 mysql 简介安装

    Python 3 mysql 简介安装 一.数据库是什么 1.  什么是数据库(DataBase,简称DB) 数据库(database,DB)是指长期存储在计算机内的,有组织,可共享的数据的集合.数据 ...

  6. 多表查询思路、navicat可视化软件、python操作MySQL、SQL注入问题以及其他补充知识

    昨日内容回顾 外键字段 # 就是用来建立表与表之间的关系的字段 表关系判断 # 一对一 # 一对多 # 多对多 """通过换位思考判断""" ...

  7. python实现简易数据库之二——单表查询和top N实现

    上一篇中,介绍了我们的存储和索引建立过程,这篇将介绍SQL查询.单表查询和TOPN实现. 一.SQL解析 正规的sql解析是用语法分析器,但是我找了好久,只知道可以用YACC.BISON等,sqlit ...

  8. Python的简介以及安装和第一个程序以及用法

    Python的简介: 1.Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.自从20世纪90年代初Python语言诞生至今,它逐渐被广泛应用于处理系统管理任务和Web编程.Pytho ...

  9. python 全栈开发,Day74(基于双下划线的跨表查询,聚合查询,分组查询,F查询,Q查询)

    昨日内容回顾 # 一对多的添加方式1(推荐) # book=Book.objects.create(title="水浒传",price=100,pub_date="164 ...

随机推荐

  1. AS中的minSdkVersion、compileSdkVersion、targetSdkVersion、buildTools及tools关系和区别

    1.参考文章关于compileSdk.minSdk.targetSdk的文章 http://chinagdg.org/2016/01/picking-your-compilesdkversion-mi ...

  2. Codeforces 1101G(线性基)

    题目链接 题意 将序列尽可能分成多段使得任意$x \geq 1$段内的所有元素的异或和大于$0$问最多多少段 思路 首先,如果所有元素异或和等于$0$答案显然为$-1$,否则构造整个序列的线性基,这个 ...

  3. YYS FZU - 2278 (期望)JAVA

    题目链接: G - YYS FZU - 2278 题目大意: 我们现在想要收集到n个卡片,现在已知抽到每种卡片的概率为1/n,现在每隔(n-1)!天就可以进行一次抽奖,问收集齐所有卡片的期望天数. 具 ...

  4. django项目实现中文检索

    在settings.py中设置 EMAIL_USE_SSL = True EMAIL_HOST = 'smtp.qq.com'  # 如果是 163 改成 smtp.163.com EMAIL_POR ...

  5. JS基础之传参(值传递、对象传递)

    一.概念 我们需了解什么是按值传递(call by value),什么是按引用传递(call by reference).在计算机科学里,这个部分叫求值策略(Evaluation Strategy). ...

  6. spring MVC如何获取session传值到前台

    Session简单介绍 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下).因此,在需要保存用户数据时,服务器程 ...

  7. jQuery第七章插件的编写和使用

    1.本章目标 编写jquery插件 2.插件 也称为扩展,是一种按照一定的规范的应用程序接口编写出来的程序 插件的目标是给已有的一系列函数做一个封装,以便在其他的地方复用,方便维护和开发效率 3.jq ...

  8. element el-tree 添加图标

    1.指定渲染函数:render-content="renderContent" <el-tree ref="tree" :data="funct ...

  9. docker修改默认存储位置

    前言:我这是默认安装的docker,所以其存放位置是/var/lib/docker,你可以发现是在/下面,之后你用docker 拉取的镜像文件也存放在这下面,这样就很快导致/空间爆满 1.修改配置文件 ...

  10. node+mongoose+vue

    app.js 入门 let express = require('express'); let app = express(); let allowCrossDomain = function (re ...