博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
django
阅读量:5817 次
发布时间:2019-06-18

本文共 7261 字,大约阅读时间需要 24 分钟。

  

 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()
    
index

这是index页面

index.html
    
Title

当前时间是:@@time@@

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_serverfrom jinja2 import Templatedef 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()
  
Title

姓名:{
{name}}

爱好:

    {% for hobby in hobby_list %}
  • {
    {hobby}}
  • {% endfor %}
index2.html

 

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

import pymysqlfrom wsgiref.simple_server import make_serverfrom jinja2 import Templateconn = 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的表现有些区别

 

pycharm定位py文件小技巧

 

转载于:https://www.cnblogs.com/perfey/p/9588479.html

你可能感兴趣的文章
学生名单
查看>>
(转) 多模态机器翻译
查看>>
【官方文档】Nginx负载均衡学习笔记(三) TCP和UDP负载平衡官方参考文档
查看>>
矩阵常用归一化
查看>>
Oracle常用函数总结
查看>>
【聚能聊有奖话题】Boring隧道掘进机完成首段挖掘,离未来交通还有多远?
查看>>
USNews大学排名遭美国计算机研究学会怒怼,指排名荒谬要求撤回
查看>>
七大关键数据 移动安全迎来历史转折点
查看>>
盘点物联网网关现有联网技术及应用场景
查看>>
mui 总结2--新建第一个app项目
查看>>
nginx的lua api
查看>>
考研太苦逼没坚持下来!看苑老师视频有点上头
查看>>
HCNA——RIP的路由汇总
查看>>
zabbix监控php状态(四)
查看>>
定时任务的创建
查看>>
实战Django:小型CMS Part2
查看>>
原创]windows server 2012 AD架构试验系列 – 16更改DC计算机名
查看>>
统治世界的十大算法
查看>>
linux svn安装和配置
查看>>
SSH中调用另一action的方法(chain,redirect)
查看>>