Django初识

Django

一.模板渲染JinJa2

1.下载jinja2

在cmd中输入命令:    pip install jinja2

注意:如果不成功,查看是否设置环境变量

给python文件中的scripts文件路径设置环境变量

2.html中代码的书写

    <h1>姓名:{{name}}</h1>
   <h1>爱好:</h1>
   <ul>
      {% for hobby in hobby_list %}
       <li>{{hobby}}</li>
      {% endfor %}
   </ul>
​

3.py文件中代码的书写

def index():
   with open("index2.html", "r",encoding='utf-8') as f:
       data = f.read()
   template = Template(data)  # 生成模板文件
   ret = template.render({"name": "于谦", "hobby_list": ["烫头", "泡吧"]})  # 把数据填充到模板里面
   return [bytes(ret, encoding="utf8"), ]
​
​

二.mvc和mtv框架

mvc

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

 

 

MTV

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

 

  • M 代表模型(Model): 负责业务对象和数据库的关系映射(ORM)。

  • T 代表模板 (Template):负责如何把页面展示给用户(html)。

  • V 代表视图(View):   负责业务逻辑,并在适当时候调用Model和Template。

 

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

 

  

 

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

 

三.在cmd中创建一个Django项目的步骤

先操作:
D:   --->进入D盘
cd 文件夹 ---->进入对应的文件夹
​
然后:
1.创建一个名为'myjango'的Django项目
django-admin startproject myjango

2.在项目目录下创建应用
方法一:python manage.py startapp app1
方法二:django-admin manage.py startapp app2

3.注册app在setting文件中
INSTALLED_APPS = [
  'django.contrib.admin',
  'django.contrib.auth',
  'django.contrib.contenttypes',
  'django.contrib.sessions',
  'django.contrib.messages',
  'django.contrib.staticfiles',
  'app1.apps.App02Config',                   #方法一
  'app2',   #方法二  
]

四.基于Django实现一个简单的实例

1.url控制器
from app1 import views                #找到app1应用下的views文件
​
urlpatterns = [
   url(r'',views.login)             #匹配正则为空,一打开连接就触发login函数
]
​
2.视图views
from django.shortcuts import render          
​
​
# Create your views here.
​
def login(request): #Django已经编译好,直接通过render方法打开需要的资源
   return render(request,'login.html',{'people':'小强'})   #也可直接以字典的形式传递参数
 
3.模板,在templates文件夹中建立的html文件
<div>哈哈</div>
<div>当前登录的用户是:{{ people }}</div>
<form>
   用户名:<input type="text" name="username">
   <input type="submit">
</form>
​

4.执行项目

 

 

 

五.Django基础之URL路由系统

1.URL配置的基本格式

from app1 import views
url_list=[
url(正则表达式,views视图函数,参数,别名)
]
​
参数说明 
  正则表达式:一个正则表达式字符串
  views视图函数:一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
  参数:可选的要传递给视图函数的默认参数(字典形式)
  别名:一个可选的name参数

2.正则表达式详解

URL基本配置:
​
from app1 import views                  #导入view视图函数
​
urlpatterns = [                     #若要在URL中匹配信息,则给对应的加()
   
   url(r'^art/(\d{4})/$',views.articles_2003),      #匹配年份4个数字
  #注意:如果'匹配年份' 和 '匹配年份月份'在一起, 匹配年份在前,一般需要给最后加上'$',不 #然'匹配年份月份'的时候会被 '匹配年份'的给拦截
 
   
   url(r'^art/(\d{4})/(\d{2})',views.articles) #匹配年份4个数字,月份2个数字
]
​
​
注意事项:
      1. urlpatterns中的元素按照书写顺序从上往下逐一匹配正则表达式,一旦匹配成功则不再继续。
      2. 若要从URL中捕获一个值,只需要在它周围放置一对圆括号(分组匹配)。
      3. 不需要添加一个前导的反斜杠(也就是写在正则最前面的那个/),因为每个URL 都有。例如,应该是^articles 而不是 ^/articles。
      4.每个正则表达式前面的'r' 是可选的但是建议加上。
      5. ^articles&  以什么结尾,以什么开头,严格限制路径
views视图:

from django.shortcuts import render,HttpResponse     #导入HttpResponse '响应'方法

                                #request请求
                                #HttpResponse响应
		
def articles_2003(request,year):     
    return  HttpResponse(year)


def articles(request,year,month):		#如果在URL中没有给年份月份命名,那个就要注意书写顺序,
    									#不然顺序就会错乱
        								#例如:在URL获取的年份正常顺序为 2017 11
    										#未命名顺序写反获取的就是	11 2017
    return HttpResponse(year+month)         											
										

3.分组命名匹配详解

URL内容:

from app1 import views

urlpatterns = [
							
    url(r'^art/(?P<year>\d{4})/$', views.articles_2003),      
    url(r'^art/(?P<year>\d{4})/(?P<month>\d{2})', views.articles)
    url(r'^art/', views.articles_2003)    #从URL中什么都不回去,与'获取年份'调用views视图中同一个
]										  #函数方法,用户输入无年份则取默认值,有年份则获取年份

#从URL中获取内容,以及给相应正则内容命名规范:  (?P<命名>正则内容)   
views视图:

from django.shortcuts import render,HttpResponse

def articles_2003(request,year='2019'):  #如果用户为输入年份,则取默认值
    return  HttpResponse(year)


def articles(request,month,year):     #URL中给相应正则命名之后,这块就不用担心顺序不对,导致接收参数
									#内容不对的问题了
    return HttpResponse(year+month)


4.include '应用'中的URL  (也叫URL(路由)分发)

(1)总的URL下的内容:

urlpatterns = [

    url(r'^app1/',include('app1.urls'))
]

#注意:此时的正则后面不能写'$',不然就匹配不到app1路径后面的内容了
#查找的时候也不能按照之前的路径输了-->例如:127.0.0.1:8888/art/2018/11
		#应该改成 -->127.0.0.1:8888/app1/art/2018/11
(2)应用下的urls内容:(其实就是将之前的总URL内容复制,删改相应内容)


from app1 import views

urlpatterns=[
    url(r'^art/(?P<year>\d{4})/(?P<month>\d{2})', views.articles)
]
(3)url传递额外的参数给视图函数:{'内容':'内容'},必须为字符串的格式

from app2 import views

urlpatterns = [
    url(r'^art/(?P<year>\d{4})/$', views.articles_2003,{'foo':'时间'}),
    url(r'^art', views.articles_2003,{'foo':'时间'})

]

#注意:此时app2对应的 views视图  函数接受参数内也应该加上'foo'
def articles_2003(request,foo,year='2019'):
    return  HttpResponse(foo+':'+year)

posted @ 2019-05-20 22:37  socoolonly1  阅读(77)  评论(0)    收藏  举报