DJANGO
目录
Django
day51 http协议和django
1.今日内容
1.web框架的本质
2.django的下载安装使用
2.内容回顾
python基础
面向对象 类 属性 方法
网络编程 socket
通信 tcp/ip五层模型
socket 套接字 位于应用层和传输层之间的虚拟层 一组接口
并发编程 进程 线程 协程【多任务】
数据库 存储数据
前端
1.tcp/ip五层模型
应用层
传输层
网络层
数据链路层
物理层
socket
套接字 位于应用层和传输层之间的虚拟层 一组接口
c/s ——》 b/s
百度的服务器 socket服务端
- 创建socket服务端
- 绑定IP和端口
- 监听
- 等待链接
- 接收数据
- 返回数据
- 断开链接
浏览器 socket客户端
- 链接服务端
- 发送数据
- 接收数据
- 断开链接
HTTP协议
请求和应答 应用层协议
HTTP协议对收发消息的格式要求
每个HTTP请求和响应都遵循相同的格式,一个HTTP包含Header和Body两部分,其中Body是可选的。
HTTP响应的Header中有一个 Content-Type表明响应的内容格式。它的值如text/html; charset=utf-8。
text/html则表示是网页,charset=utf-8则表示编码为utf-8。
状态码
1xx
2xx
3xx 重定向
4xx 请求的错误
401
5xx 服务器的错误
请求方式 8种
get ——》 获取一个页面、图片(资源)
post ——》 提交数据
url
http://www.cnblogs.com/maple-shaw/articles/9060408.html
协议 域名和端口 HTTP(80) HTTPS(443) 路径 参数
请求(request)
浏览器 —— 》 服务器
GET 请求没有请求数据
“请求方式 url路径 协议版本\r\n
k1:v1\r\n
k2:v2\r\n
\r\n
数据”
响应(response)
服务器 —— 》 浏览器
“协议版本 状态码 状态码描述\r\n
k1:v1\r\n
k2:v2\r\n
\r\n
响应数据(响应体)”
web框架的功能
1.socket收发消息 - wsgiref uwsgi
2.根据不同的路径返回不同的内容
3.返回动态页面(字符串的替换) —— jinja2
django
2 3
flask
2
tornado
1 2 3
web框架
自定义web框架
经过上面的学习,那我们基于socket服务端的十几行代码写一个我们自己的web框架。我们先不处理浏览器发送的请求,先让浏览器能显示我们web框架返回的信息,那我们就要按照HTTP协议的格式来发送响应。
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('127.0.0.1', 8000))
sock.listen()
while True:
conn, addr = sock.accept()
data = conn.recv(8096)
# 给回复的消息加上响应状态行
conn.send(b"HTTP/1.1 200 OK\r\n\r\n")
conn.send(b"OK")
conn.close()
我们通过十几行代码简单地演示了web 框架的本质。
接下来就让我们继续完善我们的自定义web框架吧!
1.根据不同的路径返回不同的内容
这样就结束了吗? 如何让我们的Web服务根据用户请求的URL不同而返回不同的内容呢?
小事一桩,我们可以从请求相关数据里面拿到请求URL的路径,然后拿路径做一个判断...
2.根据不同的路径返回不同的内容--函数版
上面的代码解决了不同URL路径返回不同内容的需求。
我们返回的内容是简单的几个字符,那如果我可以将返回的结果封装成一个函数呢?
3.根据不同的路径返回不同的内容--函数进阶版
看起来上面的代码写了一个函数,那肯定可以写多个函数,不同的路径对应执行不同的函数拿到结果,但是我们要一个个判断路径,是不是很麻烦?我们有简单的办法来解决。
4.返回具体的HTML文件
完美解决了不同URL返回不同内容的问题。 但是我不想仅仅返回几个字符串,我想给浏览器返回完整的HTML内容,这又该怎么办呢?
没问题,不管是什么内容,最后都是转换成字节数据发送出去的。 我们可以打开HTML文件,读取出它内部的二进制数据,然后再发送给浏览器。
5.让网页动态起来
网页能够显示出来了,但是都是静态的啊。页面的内容都不会变化的,我想要的是动态网站。
没问题,我也有办法解决。我选择使用字符串替换来实现这个需求。(这里使用时间戳来模拟动态的数据)
WSGI
对于真实开发中的python web程序来说,一般会分为两部分:服务器程序和应用程序。
服务器程序负责对socket服务端进行封装,并在请求到来时,对请求的各种数据进行整理。
应用程序则负责具体的逻辑处理。为了方便应用程序的开发,就出现了众多的Web框架,例如:Django、Flask、web.py 等。不同的框架有不同的开发方式,但是无论如何,开发出的应用程序都要和服务器程序配合,才能为用户提供服务。
这样,服务器程序就需要为不同的框架提供不同的支持。这样混乱的局面无论对于服务器还是框架,都是不好的。对服务器来说,需要支持各种不同框架,对框架来说,只有支持它的服务器才能被开发出的应用使用。
这时候,标准化就变得尤为重要。我们可以设立一个标准,只要服务器程序支持这个标准,框架也支持这个标准,那么他们就可以配合使用。一旦标准确定,双方各自实现。这样,服务器可以支持更多支持标准的框架,框架也可以使用更多支持标准的服务器。
WSGI(Web Server Gateway Interface)就是一种规范,它定义了使用Python编写的web应用程序与web服务器程序之间的接口格式,实现web应用程序与web服务器程序间的解耦。
常用的WSGI服务器有uWSGI、Gunicorn。而Python标准库提供的独立WSGI服务器叫wsgiref,Django开发环境用的就是这个模块来做服务器。
django
下载安装
1.命令行
pip3 install django==1.11.21 -i https://pypi.tuna.tsinghua.edu.cn/simple
2.pycharm
创建项目
1.命令行:
找一个文件夹存放项目文件:
打开终端:
django-admin startproject 项目名称
目录介绍
mysite/
├── manage.py # 管理文件
└── mysite # 项目目录
├── __init__.py
├── settings.py # 配置
├── urls.py # 路由 --> URL和函数的对应关系
└── wsgi.py # runserver命令就使用wsgiref模块做简单的web server
启动
1.命令行
切换到项目的根目录下 manage.py
python36 manage.py runserver
—— http://127.0.0.1:8000/
python36 manage.py runserver 80
在80端口启动
python36 manage.py runserver 0.0.0.0:80
0.0.0.0:80
2.pycharm
点绿三角启动 可配置
简单使用
模板 ——》HTML 指定文件夹
urls.py
# 导入
from django.shortcuts import HttpResponse,render
# 函数
def index(request):
# return HttpResponse('index')
return render(request,'index.html')
# url和函数对应关系
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/', index),
]
1.django起一个服务器
命令行起一个django项目
项目文件名可以改,但是最好不要改,项目同名子文件夹不要改
day52 ORM
内容回顾
1.http协议
请求方式 8种 get post head put delete options trace connect
状态码
1xx
2xx 200 ok 成功
3xx 重定向
4xx 请求的错误 404 403 402
5xx 服务器的错误 500
url
https://www.baidu.com/s?wd=grid&rsv_spt=1
请求(request 浏览器给服务器发送的消息)
“请求方式 URL路径 HTTP/1.1\r\n
k1:v1\r\n
k2:v2\r\n
\r\n
请求数据(请求体)” ——》 get没有请求数据
响应(response 服务器返回给浏览器的信息)
“HTTP/1.1 状态码 状态描述\r\n
k1:v1\r\n
k2:v2\r\n
\r\n
响应数据(响应体)” ——》 HTML文本
2.浏览器发送请求和接受响应的过程
- 在浏览器上的地址栏种输入URL,回车,发送get请求;
- 服务器接收到请求,获取URL的路径,根据路径做不同的操作,把返回的数据封装到响应体中,返回给浏览器
- 浏览器接受到响应,双方断开连接
- 浏览器从响应体种获取数据,进行解析渲染。
3.web框架
本质:socket服务端
功能:
- socket收发消息 wsgi wsgiref uWSGI
- 根据不同的路径返回不同的内容
- 动态页面(字符串的替换 ——》 模板的渲染) jinja2
django 2 3
flask 2
tornado 1 2 3
4.django
下载
1.命令行:
pip install django==1.11.21 -i https://pypi.tuna.tsinghua.edu.cn/simple
创建项目
1.命令行
django-admin startproject 项目名称
2.pycharm
启动
1.命令行
cd 项目的根目录 ——》 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
今日内容
1.静态文件的配置和使用
1.静态文件的配置和使用
settings.py
STATIC_URL = '/static/' # 别名
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static1'),
os.path.join(BASE_DIR, 'static'),
os.path.join(BASE_DIR, 'static2'),
]
<link rel="stylesheet" href="/static/css/login.css"> # 别名开头
按照STATICFILES_DIRS列表的顺序进行查找。
2.简单的登录的实例
form表单提交数据注意的问题:
- 提交的地址action="" 请求的方式 method="post"
- 所有的input框有name属性
- 有一个input框的type="submit" 或者 有一个button
提交POST请求,把settings中MIDDLEWARE的'django.middleware.csrf.CsrfViewMiddleware'注释掉
3.app
创建APP
命令行
python manage.py startapp app名称
pycharm工具
tools ——》 run manage.py task ——》 startapp app名称
注册APP
INSTALLED_APPS = [
...
'app01',
'app01.apps.App01Config', # 推荐写法
]
4.ORM
Django中使用MySQL数据库的流程
1.创建一个MySQL数据库。
2.在settings中配置,Django连接MySQL数据库:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 引擎
'NAME': 'day53', # 数据库名称
'HOST': '127.0.0.1', # ip地址
'PORT':3306, # 端口
'USER':'root', # 用户
'PASSWORD':'123' # 密码
}
}
3.在与settings同级目录下的 init文件中写:
import pymysql
pymysql.install_as_MySQLdb()
4.创建表(在app下的models.py中写类):
from django.db import models
class User(models.Model):
username = models.CharField(max_length=32) # username varchar(32)
password = models.CharField(max_length=32) # username varchar(32)
5.执行数据库迁移的命令
python manage.py makemigrations # 检测每个注册app下的model.py 记录model的变更记录
python manage.py migrate # 同步变更记录到数据库中【具体的迁移,迁移到文件中】(执行完这一步以后就可以看到表结构了)
request.method=="POST"
request.method=="GET"
orm操作
原文地址:https://www.cnblogs.com/yx12138/p/11011501.html
- 10.13 netfilter5表5链介绍
- 用JAVA测量DEA页面的社交媒体流行度
- Java数组赋值
- 10.12 firewalld和netfilter
- 10.11 Linux网络相关
- 利用Crypto++实现RSA加密算法
- 重学javascript 红皮高程(6)
- WriteUp分享 | LCTF的一道preg_match绕过+出题人的锅
- 利用crypto++库实现AES加密算法
- Android之倒计时CountdownTimer用法
- WriteUp分享 | LCTF的一道padding oracle攻击+sprintf格式化字符串导致的SQL注入
- 10.27 target介绍
- Android 之游戏开发流程
- shell脚本后台运行
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 小书MybatisPlus第4篇-表格分页与下拉分页查询
- 小书MybatisPlus第3篇-自定义SQL
- Nginx + Spring Boot 实现负载均衡
- 小书MybatisPlus第2篇-条件构造器的应用及总结
- 一个案例演示 Spring Security 中粒度超细的权限控制!
- 信息收集之主机发现:nmap
- 文本文件逐行处理–用java8 Stream流的方式
- 使用java8API遍历过滤文件目录及子目录及隐藏文件
- 使用位运算、值交换等方式反转java字符串-共四种方法
- 精讲RestTemplate第2篇-多种底层HTTP客户端类库的切换
- 精讲RestTemplate第1篇-在Spring或非Spring环境下如何使用
- 在图中添加多边形
- 设置坐标轴刻度的位置和样式
- OkHttp透明压缩,收获性能10倍,外加故障一枚
- 体验spring-boot-devtools热部署,流畅且不失强大