Django前戏与介绍
Django前戏
纯手撸web框架
HTTP协议 网路传输协议 数据传输是明文的
HTTPS协议 数据传输是秘闻的
websocket协议 数据传输是密文
四大特性
基于请求响应
基于TCP、IP作用于应用层之上的协议
无状态
短 /无链接
数据格式
请求首行
请求头
\r\n
请求体
借助于wsgiref模块
#### 基础
from wsgiref.simple_server import make_server
def run(evn,response):
'''
:param evn: 请求相关的所有数据
:param response: 响应相关的所有数据
:return: 返回鬼浏览器的数据
'''
response('200 OK', [])
current_path = evn.get('PATH_INFO') # 获取到输入的后缀,也就是路由
return [b'nihao']
if __name__ == '__main__':
server = make_server('127.0.0.1',8080,run)
'''会实时监听127.0.0.1:8080地址,只要有客户端过
来都会交给run函数处理,加括号后触发函数运行'''
server.serve_forever() # 启动服务器
#####
urls.py 路由与视图函数对应关系(路由:加载地址后面的那个后缀)
views.py 视图函数(后端业务逻辑)
templates 专门用来存储html文件
# 按照功能的不同拆分之后,后续添加功能只需要在urls.py书写对应关系,然后去views.py书写业务逻辑即可
动静态网页
- 静态网页
- 页面上的数据是直接写死的,万年不变
- 动态网页
- 数据是实时更新的,
- 后端获取当前时间展示到html页面上
- 数据是从数据库中获取的展示到html页面上
- 数据是实时更新的,
# 动态网页制作
import datetime
def get_time(env):
current_time = datetime.datetime.now().strftime('%Y-%m-%d %X')
# 如何将后端获取到的数据"传递"给html文件?
with open(r'templates/03 mytime.html','r',encoding='utf-8') as f:
data = f.read()
# data就是一堆字符串
data = data.replace('dwadasdsadsadasdas',current_time) # 在后端将html页面处理好之后再返回给前端
return data
# 将一个字典传递给html文件 并且可以在文件上方便快捷的操作字典数据
from jinja2 import Template
def get_dict(env):
user_dic = {'username':'jason','age':18,'hobby':'read'}
with open(r'templates/04 get_dict.html','r',encoding='utf-8') as f:
data = f.read()
tmp = Template(data)
res = tmp.render(user=user_dic)
# 给get_dict.html传递了一个值 页面上通过变量名user就能够拿到user_dict
return res
# 后端获取数据库中数据展示到前端页面
模板语法之jinja2模块
pip3 install jinja2
"""模版语法是在后端起作用的"""
# 模版语法(非常贴近python语法)
{{ user }}
{{ user.get('username')}}
{{ user.age }}
{{ user['hobby'] }}
{% for user_dict in user_list %}
<tr>
<td>{{ user_dict.id}}</td>
<td>{{ user_dict.username}}</td>
<td>{{ user_dict.password}}</td>
<td>{{ user_dict.hobby}}</td>
</tr>
{% endfor%}
web请求流程
wsgiref模块
- 请求来的时候解析HTTP格式的数据,封装成大字典
- 响应走的时候给数据打包成符合HTTP格式,再返回给浏览器
Django介绍
Python三大主流框架
- Django
- 特点:大而全,自带的功能特别特别的多,
- 不足:有时过于笨重
- flask
- 特点:小而精,自带功能特别少,第三方模块特别多,如果将flask第三方模块全加起来,完全可以盖过Django
- 不足:比较依赖于第三方的开发者
- tornado
- 特点:异步非阻塞,支持高并发,牛逼到可以开发游戏服务器
- 不足:暂时不会
Django的注意事项
- 如何能让自己计算机正常的启动Django项目
- 计算机名称不能有中文
- 一个pycharm窗口只开一个项目,不要文件夹套文件夹
- 项目里的所有文件尽量不要出现中文
- Python解释器尽量使用3.4~3.6之间的版本
- 如果项目报错,点击最后一个报错信息,去源代码中吧逗号删掉
- Django版本问题
- 1.X 2.X 3.X(最新版本)
- 1.X和2.X本身差距也不大
- 公司之前用的1.8 有一些项目用的2.0
- django安装
- pip3 install django==1.11.11
如果已经安装了其他版本 无需自己卸载,直接重新装 会自动卸载安装新的 - 如果报错 看看是不是timeout 如果是 那么只是网速波动,重新安装即可
- 验证是否安装成功的方式:终端输入django-admin看看有没有反应
- pip3 install django==1.11.11
Django基本操作
# 命令行操作
# 1.创建Django项目
django-admin startproject mysite
# 2.启动Django项目
# 一定要先切换到项目目录下
python3 manage.py runserver
# 默认是http://127.0.0.1:8080
# 3. 创建应用
pytho3 manage.py startapp app01
# 应用名应该见名知意:user,order,web
# pycharm操作
# 1.创建:new project 选择Django项目即可
# 2.启动:可以命令行启动,也可以绿色箭头启动
# 3.创建应用
1.pycharm提供的终端直接输入完整命令
2.pycharm
tools
run manage.py task提示(前期不要用 给我背完整命令)
# 4 修改端口号以及创建server
edit confi....
Django中的应用
"""
django是一款专门用来开发app的web框架
django框架就类似于是一所大学(空壳子)
app就类似于大学里面各个学院(具体功能的app)
比如开发淘宝
订单相关
用户相关
投诉相关
创建不同的app对应不同的功能
选课系统
学生功能
老师功能
一个app就是一个独立的功能模块
"""
*************创建的应用一定要去配置文件中注册**********
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01.apps.App01Config', # 全写
'app01', # 简写
]
# 创建出来的的应用第一步先去配置文件中注册 其他的先不要给我干
ps:你在用pycharm创建项目的时候 pycharm可以帮你创建一个app并且自动注册
主要文件介绍
-mysite项目文件夹
--mysite文件夹
---settings.py 配置文件
---urls.py 路由与视图函数对应关系(路由层)
---wsgi.py wsgiref模块(不考虑)
--manage.py django的入口文件
--db.sqlite3 django自带的sqlite3数据库(小型数据库 功能不是很多还有bug)
--app01文件夹
---admin.py django后台管理
---apps.py 注册使用
---migrations文件夹 数据库迁移记录
---models.py 数据库相关的 模型类(orm)
---tests.py 测试文件
---views.py 视图函数(视图层)
命令行与pycharm创建区别
# 1 命令行创建不会自动有templatew文件夹 需要你自己手动创建而pycharm会自动帮你创建并且还会自动在配置文件中配置对应的路径
# pycharm创建
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')]
]
# 命令行创建
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
]
"""
也就意味着你在用命令创建django项目的时候不单单需要创建templates文件夹还需要去配置文件中配置路径
'DIRS': [os.path.join(BASE_DIR, 'templates')]
"""
Django小白必会三板斧
'''
1. HttpResponse
返回字符串类型
return HttpResponse("OK")
2. render
返回HTML文件
return render(request, "index.html", data)
3. redirect
重定向
return redirect('https://www.mzitu.com/')
return redirect('/home/')
'''
静态文件配置
'''
我们将html文件默认都放在templates文件夹下
将网站所使用的静态文件默认放在static文件夹下
静态文件:
前端已经写好的,能够直接调用使用的文件
js
css
图片
第三方前端框架
...
拿来就直接使用的
Django默认是不会自动创建static文件夹的,需要自己手动创建
一般情况下在static文件夹内还会做进一步的划分处理,将js,css,图片等分文件夹存放
'''
"""
在浏览器中输入url能够看到对应的资源
是因为后端提前开设了该资源的借口
如果访问不到资源 说明后端没有开设该资源的借口
http://127.0.0.1:8000/static/bootstrap-3.3.7-dist/css/bootstrap.min.css
"""
# 静态文件配置
"""
****************************************************************
当你在写django项目的时候 可能会出现后端代码修改了但是前端页面没有变化的情况
1.你在同一个端口开了好几个django项目
一直在跑的其实是第一个django项目
2.浏览器缓存的问题
settings
network
disable cache 勾选上
*****************************************************************
"""
STATIC_URL = '/ooo/' # 类似于访问静态文件的令牌
"""如果你想要访问静态文件 你就必须以static开头"""
"""
/static/bootstrap-3.3.7-dist/js/bootstrap.min.js
/static/令牌
取列表里面从上往下依次查找
bootstrap-3.3.7-dist/js/bootstrap.min.js
都没有才会报错
"""
# 静态文件配置
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static'),
os.path.join(BASE_DIR,'static1'),
os.path.join(BASE_DIR,'static2'),
]
# 静态文件动态解析
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
<script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
# form表单默认是get请求数据
http://127.0.0.1:8000/login/?username=jason&password=123
"""
form表单action参数
1.不写 默认朝当前所在的url提交数据
2.全写 指名道姓
3.只写后缀 /login/
"""
# 在前期我们使用django提交post请求的时候 需要取配置文件中注释掉一行代码
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
request对象方法初识
request.method # 返回请求方式 并且是全大写的字符串形式 <class 'str'>
request.POST # 获取用户post请求提交的普通数据不包含文件
request.POST.get() # 只获取列表最后一个元素
request.POST.getlist() # 直接将列表取出
request.GET # 获取用户提交的get请求数据
request.GET.get() # 只获取列表最后一个元素
request.GET.getlist() # 直接将列表取出
"""
get请求携带的数据是有大小限制的 大概好像只有4KB左右
而post请求则没有限制
"""
def login(request):
# 返回一个登陆界面
"""
get请求和post请求应该有不同的处理机制
:param request: 请求相关的数据对象 里面有很多简易的方法
:return:
"""
# print(type(request.method)) # 返回请求方式 并且是全大写的字符串形式 <class 'str'>
# if request.method == 'GET':
# print('来了 老弟')
# return render(request,'login.html')
# elif request.method == 'POST':
# return HttpResponse("收到了 宝贝")
if request.method == 'POST':
return HttpResponse("收到了 宝贝")
return render(request, 'login.html')
框架设计模型(MTV与MVC)
MTV
M: models 模型层
T:templates 模板层
V:views 视图层
MVC
M:models 模型层
V:views 视图层
C:controller 控制层
Django框架自称是MTV,本质也是MVC框架
Django的本地化(国际化)配置
LANGUAGE_CODE = 'zh-hans'
# S 必须大写(windows平台可以小写)
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False
\

浙公网安备 33010602011771号