Django的项目创建
print('hello world')
- django:音乐家的名字:优雅,新闻网站
Django
Django的数据库
- sqllite3:django自带的,专门为初学者准备的
- mysql:索引、引擎、事务(一致性,原子性、持久性、隔离性)
手动实现HTTP服务端
- 套接字:socket
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('',8000))
# 绑定可用端口IP
s.listen(5)
# 开启监听
with open('1.html','r', encoding='utf-8') as fp:
html_data = fp.read()
while 1:
c,c_addr = s.accept()
# 长连接:一直在连接状态
# 短链接:接收到请求,完成任务,即断开
# 一个request 返回一个reponse就断开了
data = c.recv(1024)
print(data.decode('utf-8'))
# data -> Connection -> keep-alive
html = "HTTP/1.1 200 OK\r\n" + \
"Server: bfe/1.0.8.18\r\n" + \
"Content-Type: text/html\r\n" + \
"\r\n" + \
html_data
c.send(html.encode('utf-8'))
c.close()
HTTP协议三次握手
a(192.168.1.203) -> SYN a = 1 -> b(192.168.1.20)
b -> ACK b = a + 1 -> a TIME_WAIT # 设置为更短的
# SYN泛洪攻击 DDOS
a -> ACK a = b + 1 -> b 连接建立
65535
Scapy 包 可以封装TCP数据包
- 标志位:
- SYN:连接发起
- ACK:请求响应
- FIN:连接断开
- TCP泛洪及DDOS
Django命令
- 开启django项目:django-admin startproject proname
- 开启子APP:python manage.py startapp app1
- 开启测试服务器:python manage.py runserver
承载压力极低,200-500之间,调试和访问信息输出,自动检测代码变更,并重新启动
tornado默认并不会这样
Django目录结构
- settings.py:整个项目的配置
- urls.py:项目的主路由文件
- wsgi.py:服务器协议文件,接管APP
- manage.py:命令行管理工具,
APP目录结构
app1
migrations: 保存迁移记录
__init__.py: 声明当前文件夹为一个包
admin.py:admin后台界面管理工具文件
app.py: app单元文件
test.py: 单元测试驱动的
models.py: 编写ORM
views.py: 视图文件
Django模板
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
- 创建项目目录下任意目录
- 配置与以上项中:
'DIRS': [],
选项
- 配置与以上项中:
Django返回Response
form django.http import HttpResponse
HttpResponse:返回HTML字符串
from django.shortscuts import render
render:返回并渲染模板目录下的对应模板文件,处理模板变量
<!-- 模板变量 -->
{{ message }}
def Index(request):
message = 'abc'
return render(request,'1.html',locals()) # 局部变量全部返回
return render(request,'1.html',{'message':'abc'}) # 单独返回
Django静态资源
- 静态资源:img,js,css,video
- 防盗链:
- 盗链行为:节约流量,流量费用()
- settings.py配置:
STATICFILES_DIRS = (
os.path.join(BASE_DIR,'static'),
)
# static-> 静态资源目录
表单提交
- CSRF:跨站请求伪造
<form action="/register/" method="POST">
{% csrf_token %}
<input type='text' name='account'>
<input type='text' name='password'>
<button type="submit">提交</button>
</form>
- 获取表单结果,通过name值做key构造的QueryDict值
def register(request):
account = request.POST.get('account')
password = request.POST.get('password')
ORM映射
对象关系型映射
- SQLite3
- mysql
- oracle
- postgersql
ORM对于原生的SQL效率不高,Django的ORM一直是被认为比较差劲的
开发效率高,开发者省事
- 一个表代表orm中的一个类
- 表中的一个字段 代表 类中的一条变量属性
- ORM映射关系类必须继承自models.Model基类
class User(models.Model):
# 模型类 orm映射类
account = models.CharField(max_length=50)
password = models.CharField(max_length=50)
- 查找迁移文件
python manage.py makemigrations
- 迁移数据库
python manage.py migrate
Admin界面
管理ORM映射表的一套系统
- 具有操作数据库的权限,这个地方的用户密码是绝对安全
- 创建admin后台超级用户
python
- 自己的ORM表如何在admin界面下被看到
from django.contrib import admin
from . import models
# Register your models here.
admin.site.register(models.User)
# 注册 models.User到admin界面,
ORM的DML语句
user = models.User.objects.get(account=account,password=password)
# get: 只能返回单条结果
响应式布局
- bootstrap
- bootmetro
常见行业关键词
- QueryDict
- Domain:一个域名中的最重要的部分
- https://www.baidu.com/abc/?a=1#
- https://: scheme
- domain:www.baidu.com
- /abc/:path
- ?a=1&b=1:Query
- #:锚点符:在整个页面定位
Django
- 手动的写一个models类,实现一下简单的登陆注册
- 注册:怎么去创建数据 用ORM