PythonWeb开发--Django框架

1.MVC与MTV

 

MVC

 
Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器©和视图(V)三层,他们之间以一种插件式的、松耦合的方式连接在一起,模型负责业务对象与数据库的映射(ORM),视图负责与用户的交互(页面),控制器接受用户的输入调用模型和视图完成用户的请求,其示意图如下所示:

在这里插入图片描述
 

  • Model:模型,表示应用程序核心,比如数据记录列表
    模型就是进行业务逻辑判断和数据库存取,以我们平常的说法,也就是所谓的业务逻辑处理,可以说实现了三层中BLL层和DAL层的功能
     
  • View:显示,对数据进行显示
    视图就是用户看到并与客户进行交互的界面,也就是们所说的网页。MVC中的视图除了HTML基本元素之外,还包括XML等标识性语言。MVC可以处理多个视图,而一个视图也不想HTML中那样,仅代表一个网页,而是一个网页有好多视图拼接而成,有母版之说,也有自己不一样的东西。
     
  • Controller:控制器,对数据库的各种操作进行控制
    控制器是将用户输入的指令和数据传递给业务模型,当用户在视图中申请提交表单时,控制器不会进行处理,而是调用适合的模型去处理。说是控制器,其实也像路由,指向模型的路由。
     

MTV

 
Django的MTV模式本质上和MVC是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同,Django的MTV分别是值:

  • M 代表模型(Model): 负责业务对象和数据库的关系映射(ORM)。
  • T 代表模板 (Template):负责如何把页面展示给用户(html)。
  • V 代表视图(View): 负责业务逻辑,并在适当时候调用Model和Template。

 

除了以上三层之外,还需要一个URL分发器,它的作用是将一个个URL的页面请求分发给不同的View处理,View再调用相应的Model和Template,MTV的响应模式如下所示:
 

在这里插入图片描述
 

一般是用户通过浏览器向我们的服务器发起一个请求(request),这个请求回去访问视图函数,(如果不涉及到数据调用,那么这个时候视图函数返回一个模板也就是一个网页给用户),视图函数调用模型,模型去数据库查找数据,然后逐级返回,视图函数把返回的数据填充到模板中空格中,最后返回网页给用户。

 
 

2.Django的下载与基本命令(Mac)

 

下载

	pip3 install django

 

创建一个Django项目

	django-admin.py startproject mysite

当前目录下会生成mysite的工程,目录结构如下:
 

在这里插入图片描述
 

  • manage.py ----- Django项目里面的工具,通过它可以调用django shell和数据库等。
  • settings.py ---- 包含了项目的默认设置,包括数据库信息,调试标志以及其他一些工作的变量。
  • urls.py ----- 负责把URL模式映射到应用程序。
     

在mysite项目下创建应用

	python manage.py startapp blog

 

 

启动Django项目

 

	python manage.py runserver 8080

 
 

3.Django初探

 

Path函数

Django path() 可以接收四个参数,分别是两个必选参数:route、view 和两个可选参数:kwargs、name。
语法格式如下:

	path(route, view, kwargs=None, name=None)
  • route: 字符串,表示 URL 规则,与之匹配的 URL 会执行对应的第二个参数 view。
  • view: 用于执行与正则表达式匹配的 URL 请求。
  • kwargs: 视图使用的字典类型的参数。
  • name: 用来反向获取 URL。

Path函数会去views.py中自动匹配视图函数,自动传递request参数。

 

在这里插入图片描述

 

在这里插入图片描述
 

render函数

render(request, template_name, context=None, content_type=None, status=None, using=None)

此方法的作用—结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。
通俗的讲就是把context的内容, 加载进templates中定义的html文件, 并通过浏览器渲染呈现。

参数:

  • request: 是一个固定参数
  • template_name: templates中定义的文件,注意路径名。比如:“templates/polls/index.html”, 则参数这样写:“polls/index.html”
  • context: 要传入文件中用于渲染呈现的数据, 默认是字典格式
  • content_type: 生成的文档要使用的MIME 类型。默认为DEFAULT_CONTENT_TYPE 设置的值。
  • status: http的响应代码,默认是200.
  • using: 用于加载模板使用的模板引擎的名称。

 
在这里插入图片描述

 

配置静态文件

 
在这里插入图片描述
 

4.Django路由层

 

re_path

 
re_path和path的作用是一样的。只不过’re_path’是在写url的时候可以用正则表达式,功能更加强大。
 
在这里插入图片描述

 

  • 若要从URL 中捕获一个值,只需要在它周围放置一对圆括号
  • 不需要添加一个前导的反斜杠,因为每个URL 都有。例如,应该是^articles 而不是 ^/articles
  • 每个正则表达式前面的’r’ 是可选的但是建议加上。它告诉Python 这个字符串是“原始的” —— 字符串中任何字符都不应该转义

 

有名分组

 

上面的示例使用简单的、没有命名的正则表达式组(通过圆括号)来捕获URL 中的值并以位置 参数传递给视图。在更高级的用法中,可以使用命名的正则表达式组来捕获URL 中的值并以关键字 参数传递给视图。

在Python 正则表达式中,命名正则表达式组的语法是(?P< name>pattern),其中name 是组的名称,pattern 是要匹配的模式。
 

在这里插入图片描述

 
在这里插入图片描述

 

分发

当一个url请求过来之后

  1. 先到项目主目录下的urls内。
  2. 由这个url做处理分发给其他app内的urls。

 

在这里插入图片描述

 

在这里插入图片描述
 

反向解析

 

在使用Django 项目时,一个常见的需求是获得URL 的最终形式,以用于嵌入到生成的内容中(视图中和显示给用户的URL等)或者用于处理服务器端的导航(重定向等)。人们强烈希望不要硬编码这些URL(费力、不可扩展且容易产生错误)或者设计一种与URLconf 毫不相关的专门的URL 生成机制,因为这样容易导致一定程度上产生过期的URL。

在需要URL 的地方,对于不同层级,Django 提供不同的工具用于URL 反查

  • 在模板中:使用url 模板标签。
  • 在Python 代码中:使用from django.urls import reverse()函数

 

在这里插入图片描述

 

在这里插入图片描述

 

  • path函数的第三个参数位置增加name属性
  • html文件中在action属性后增加
  • 视图函数的render方法会在返回html文件时把path的第三个参数name在html文件中的{% %}内替换成第一个参数

 

另在views中

	from django.urls import reverse

可以引入反向解析函数,可以直接得到该url

在这里插入图片描述
 
在这里插入图片描述

 

命名空间: 当命名你的URL 模式时,请确保使用的名称不会与其它应用中名称冲突。如果你的URL 模式叫做comment,而另外一个应用中也有一个同样的名称,当你在模板中使用这个名称的时候不能保证将插入哪个URL。在URL 名称中加上一个前缀,比如应用的名称,将减少冲突的可能。我们建议使用myapp-comment 而不是comment。

 
在这里插入图片描述

 


 

Django2.0版本的path

 

基本规则:

  • 使用尖括号(<>)从url中捕获值。

  • 捕获值中可以包含一个转化器类型(converter type),比如使用 int:name 捕获一个整数变量。若果没有转化器,将匹配任何字符串,当然也包括了 / 字符。

  • 无需添加前导斜杠
     

     urlpatterns = [  
     	path('articles/2003/', views.special_case_2003),  
     	path('articles/<int:year>/', views.year_archive),  
     	path('articles/<int:year>/<int:month>/', views.month_archive),  
     	path('articles/<int:year>/<int:month>/<slug>/', views.article_detail),  
     ]  
    

 

Django默认支持以下5个转化器:

  • str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
  • int,匹配正整数,包含0。
  • slug,匹配字母、数字以及横杠、下划线组成的字符串。
  • uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
  • path,匹配任何非空字符串,包含了路径分隔符

 

自定义转换器

 

对于一些复杂或者复用的需要,可以定义自己的转化器。转化器是一个类或接口,它的要求有三点:

  • regex 类属性,字符串类型
  • to_python(self, value) 方法,value是由类属性 regex 所匹配到的字符串,返回具体的Python变量值,以供Django传递到对应的视图函数中。
  • to_url(self, value) 方法,和 to_python 相反,value是一个具体的Python变量值,返回其字符串,通常用于url反向引用。

 
在这里插入图片描述
 
使用register_converter 将其注册到URL配置中:

在这里插入图片描述
 
在这里插入图片描述
 

5.Django的视图层

 

一个视图函数,简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应。响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. . . 是任何东西都可以。无论视图本身包含什么逻辑,都要返回响应。代码写在哪里也无所谓,只要它在你的Python目录下面。除此之外没有更多的要求了——可以说“没有什么神奇的地方”。为了将代码放在某处,约定是将视图放置在项目或应用程序目录中的名为views.py的文件中。

 

request

 
Django将请求报文中的请求行、首部信息、内容主体封装成 HttpRequest 类中的属性。 除了特殊说明的之外,其他均为只读的。

	1.HttpRequest.GET
	一个类似于字典的对象,包含 HTTP GET 的所有参数。详情请参考 QueryDict 对象。

	2.HttpRequest.POST
	一个类似于字典的对象,如果请求中包含表单数据,则将这些数据封装成 QueryDict 对象。
	POST 请求可以带有空的 POST 字典 —— 如果通过 HTTP POST 方法发送一个表单,但是表单中没有任何的数据,
	QueryDict 对象依然会被创建。因此,不应该使用 if request.POST  来检查使用的是否是POST 方法;
	应该使用 if request.method == "POST"
	另外:如果使用 POST 上传文件的话,文件信息将包含在 FILES 属性中。
	注意:键值对的值是多个的时候,比如checkbox类型的input标签,select标签,需要用:
    request.POST.getlist("hobby")

	3.HttpRequest.body
	一个字符串,代表请求报文的主体。在处理非 HTTP 形式的报文时非常有用,例如:二进制图片、XML,Json等。
	但是,如果要处理表单数据的时候,推荐还是使用 HttpRequest.POST 。
	
	4.HttpRequest.path
	一个字符串,表示请求的路径组件(不含域名)。
	例如:"/music/bands/the_beatles/"
	
	5.HttpRequest.method
	一个字符串,表示请求使用的HTTP 方法。必须使用大写。
	例如:"GET"、"POST"

	6.HttpRequest.encoding
	一个字符串,表示提交的数据的编码方式(如果为 None 则表示使用 DEFAULT_CHARSET 的设置,默认为 'utf-8')。
	这个属性是可写的,你可以修改它来修改访问表单数据使用的编码。
	接下来对属性的任何访问(例如从 GET 或 POST 中读取数据)将使用新的 encoding 值。
	如果你知道表单数据的编码不是 DEFAULT_CHARSET ,则使用它。

	7.HttpRequest.META
	一个标准的Python 字典,包含所有的HTTP 首部。具体的头部信息取决于客户端和服务器,下面是一些示例:

	    CONTENT_LENGTH —— 请求的正文的长度(是一个字符串)。
	    CONTENT_TYPE —— 请求的正文的MIME 类型。
	    HTTP_ACCEPT —— 响应可接收的Content-Type。
	    HTTP_ACCEPT_ENCODING —— 响应可接收的编码。
	    HTTP_ACCEPT_LANGUAGE —— 响应可接收的语言。
	    HTTP_HOST —— 客服端发送的HTTP Host 头部。
	    HTTP_REFERER —— Referring 页面。
	    HTTP_USER_AGENT —— 客户端的user-agent 字符串。
	    QUERY_STRING —— 单个字符串形式的查询字符串(未解析过的形式)。
	    REMOTE_ADDR —— 客户端的IP 地址。
	    REMOTE_HOST —— 客户端的主机名。
	    REMOTE_USER —— 服务器认证后的用户。
	    REQUEST_METHOD —— 一个字符串,例如"GET" 或"POST"。
	    SERVER_NAME —— 服务器的主机名。
	    SERVER_PORT —— 服务器的端口(是一个字符串)。

	从上面可以看到,除 CONTENT_LENGTH 和 CONTENT_TYPE 之外,
	请求中的任何 HTTP 首部转换为 META 的键时,都会将所有字母大写并将连接符替换为下划线最后加上 HTTP_  前缀。
	所以,一个叫做 X-Bender 的头部将转换成 META 中的 HTTP_X_BENDER 键。

	8.HttpRequest.FILES
	一个类似于字典的对象,包含所有的上传文件信息。
	FILES 中的每个键为<input type="file" name="" /> 中的name,值则为对应的数据。
	注意,FILES 只有在请求的方法为POST 且提交的<form> 带有enctype="multipart/form-data" 的情况下,
	才会包含数据。否则,FILES 将为一个空的类似于字典的对象。

	9.HttpRequest.COOKIES
	一个标准的Python 字典,包含所有的cookie。键和值都为字符串。

	10.HttpRequest.session
	一个既可读又可写的类似于字典的对象,表示当前的会话。只有当Django 启用会话的支持时才可用。

	11.HttpRequest.user(用户认证组件下使用)
	一个 AUTH_USER_MODEL 类型的对象,表示当前登录的用户。
	如果用户当前没有登录,user 将设置为 django.contrib.auth.models.AnonymousUser 的一个实例。你可以通过 is_authenticated() 区分它们。

    例如:

    if request.user.is_authenticated():
        # Do something for logged-in users.
    else:
        # Do something for anonymous users.
        
      user 只有当Django 启用 AuthenticationMiddleware 中间件时才可用。

 -------------------------------------------------------------------------------------

    匿名用户
    class models.AnonymousUser

    django.contrib.auth.models.AnonymousUser 类实现了django.contrib.auth.models.User 接口,但具有下面几个不同点:

    id 永远为None。
    username 永远为空字符串。
    get_username() 永远返回空字符串。
    is_staff 和 is_superuser 永远为False。
    is_active 永远为 False。
    groups 和 user_permissions 永远为空。
    is_anonymous() 返回True 而不是False。
    is_authenticated() 返回False 而不是True。
    set_password()、check_password()、save() 和delete() 引发 NotImplementedError。
    New in Django 1.8:
    新增 AnonymousUser.get_username() 以更好地模拟 django.contrib.auth.models.User。
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值