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请求

 

  

原文地址:https://www.cnblogs.com/J-7-H-2-F-7/p/9588595.html