简介
- Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。
- Django是一个开放源代码的Web应用框架,由Python写成。
- Django遵守BSD版权,初次发布于2005年7月, 并于2008年9月发布了第一个正式版本1.0 。
- Django采用了MVC的软件设计模式,即模型M,视图V和控制器C。
MVC和MTV模式
所有WEB模式通用
MVC模式
常用模式
把web应用氛围模型(M),控制器(C),视图(V)三层,以类似插件松耦合的方式连接在一起
- Model(模型):负责业务对象与数据库的对象(ORM)
- View(视图):负责与用户的交互【HTML页面】
- Controller(控制器):负责接收用户的输入调用模型和视图完成用户请求
MTV模式
非类Django无此模式
MTV模式和MVC模式本质无差,定义不同
- Model(模型):负责业务对象与数据库的对象(ORM)
- Template(模版):负责如何把页面展示给用户
- View(视图):负责业务逻辑,并在适当的时候调用Model和Template【视图函数】
django项目
创建django项目
django-admin startproject Mydjango
django默认项目架构
Mydjango #项目名称
manage.py #项目启动管理
Mydjango #项目全局应用名称
templates #自添加目录用于存放html模版
settings.py #全局应用配置信息
urls.py #全局url关联视图函数
wsgi.py
创建django项目应用
cd Mydjango
python manage.py startapp APP
项目应用架构
APP
admin.py #后台管理系统
apps.py #项目中的应用
migrations #数据库变更文件
models.py #操作数据库用
tests.py #测试用
views.py #视图函数
启动django项目
python manage.py runserver
配置文件
settings.py
在全局应用配置文件中添加项目应用
vim Mydjango/Mydjango/settings.py
INSTALLED_APPS
INSTALLED_APPS中添加项目应用
'APP',
TEMPLATES
TEMPLATES 中添加路径,templates为html存放位置
'DIRS': [os.path.join(BASE_DIR,'templates')],
STATIC
访问别名,添加静态文件路径,用于存放静态文件
STATIC_URL = '/static/'
STATICFILES_DIRS=(
os.path.join(BASE_DIR,"static"),
)
HttpResponse模块
新增测试函数[引入HttpResponse模块用于测试]
from django.shortcuts import HttpResponse
# Create your views here.
def Hello_APP(requset):
return HttpResponse("Hello Django")
也可以用render模块访问文件测试【render返回的也是HttpResponse对象】
from django.shortcuts import render
# Create your views here.
def Hello_APP(requset):
return render(requset,"index.html")
Django URL路由系统
urls.py
用法示例
==注意要以,号结尾==
path模块-普通用法
urlpatterns = [path(路径,views视图函数,参数,别名),]
re_path模块-正则用法
urlpatterns = [re_path(含正则表达式路径,views视图函数,参数,别名),]
参数说明
- 一个正则表达式字符串
- 一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
- 可选的要传递给视图函数的默认参数(字典形式)
- 一个可选的 name 参数
- 后跟views视图函数可以是FBV也可以是CBV
综合示例
vim Mydjango/Mydjango/urls.py
from APP import views
#引入项目应用函数模块
from django.urls import path,re_path
#引入urls path模块和re_path模块
urlpatterns = [
path('admin/', admin.site.urls), #系统默认
path('APP/', views.Show_time), #普通URL应用
path('login/', views.User_login,name="reg"), #普通URL应用,启用别名
re_path(r'article/(\d{4})',views.Article_txt), #带正则表达式url应用【无命名分组】
re_path(r'article/(?P<id>[a-z]{4})',views.Title_txt), #带正则表达式url应用【命名分组】
]
views 视图函数
http请求中产生两个核心对象:
- http请求:HttpRequest对象
- http响应:HttpResponse对象
views视图函数的类别
类别 | 形式 |
---|---|
FBV | 函数形式 |
CBV | 类形式 |
检测方法:isinstance(request,HttpRequest)
HttpRequest对象
request 可用简写为 req
- 请求以字符串形式发送,分请求头和请求体
- get 的url形式发送,请求头传输数据,请求体无传输数据,是空的
- post 形式发送,请求头和请求体都可以传数据
参数 | 释义 |
---|---|
request.path | 请求页面的全路径,不包含域名 |
request.session | 唯一可读写的属性,代表当前会话的字典对象 |
request.method | 请求中使用的HTTP方法的字符串,全大写表示 |
request.user | django.contrib.auth.models.User对象,代表当前登录用户 |
GET | 包含所有HTTP GET参数的类字典对象 |
POST | 包含所有HTTP POST参数的类字典对象 |
FILES | 包含所有上传文字的类字典对象 |
COOKIES | 包含所有COOKIES的标准Python字典对象;keys和values都是字符串 |
==扩展:提交方式除了常见的get和post,还有put,patch,delete,head,options,trace等,但form只能使用post和get,扩展提交方式 AJAX 中可以使用==
在响应体中添加响应头信息
def post(self,request):
ret = HttpResponse('TEXT')
ret = ['Newtext'] = 'Newtext'
#反馈给用户 响应头 Newtext=Newtext,响应体 TEXT
ret.set_cookie('c1','v2')
#响应头中加入cookies c1=v2 信息
return ret
method说明
if req.method=="GET":
代码块或函数
elseif req.method=="POST":
代码块或函数
path说明
request.path | 请求页面的全路径,不包含域名,不包含提交数值
request.get_full_path() | 请求页面的全路径,不包含域名,包含提交数值
POST说明
- 服务器收到的POST请求的情况也是可能发生的,表单form通过HTTP POST方法请求,但表单中可能没有数据
- 因此不能使用if req.POST来判断是否使用了HTTP POST方法
- 应该使用 if req.method=="POST"
FILES说明
- 标签中每一个 key 都是<input type="file" name=""/>中name属性的值
- 标签中每一个 value 都包含filename(上传文件名)、content_type(上传文件的内容类型)、content(上传文件的原始内容)
user说明
- 如果用户没有登录,user将被初始化为 django.contrib.auth.models.AnonymousUser 的实例
- 通过 user 的 is_authenticated() 方法判别用户是否登录
- if req.user.is_authenticated() 只有激活 Django 的 AuthenticationMiddleware 时该属性才可用
HttpResponse对象
HttpResponse对象需要自己创建,每个view视图请求处理方法必须返回一个HttpResponse对象
方法
方法 | 释义 |
---|---|
render() | 页面渲染【推荐】 |
reder_to_response() | 页面渲染 |
redirect("路径") | 页面跳转 |
locals() | 可以直接将函数中所有的变量传给模版 |
==如果前端带标签代码,如<a></a>被页面安全机制拦截,无渲染效果,可以使用{{NAME|safe}}来进行渲染==
FBV(函数形式)示例:
页面渲染示例
path('admin',views.test),
def test():
return render(request,"index.html")
或
return render_to_response("index.html")
页面跳转示例
path('admin',views.test.as_view()),
def test():
return redirect("https://www.djangoproject.com/")
或
return redirect("/admin")
CBV(类形式):
from django.vies import View
class 类名(View):
def dispatch(self,request,*args,**kwargs):
result = super(类名,self).dispatch(self,request,*args,**kwargs)
return result
def get(self,request):
return 返回值
def post(self,request):
return 返回值