跳转底部

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\r\n\r\n')
    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文件小技巧

 

posted on 2018-09-04 21:04  afly666  阅读(201)  评论(0编辑  收藏  举报

导航

回到顶部