内容概要

1.web框架初识

2.MTV模式

3.Django创建流程和命令行工具

4.配置文件  settings

5.视图函数  views

6.路由系统  URL

7.模板系统  template

8.models(见下一章)


1.web框架初识

  框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演。

对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端。

  最简单的Web应用就是先把HTML用文件保存好,用一个现成的HTTP服务器软件,接收用户请求,从文件中读取HTML,返回。

如果要动态生成HTML,就需要把上述步骤自己来实现。不过,接受HTTP请求、解析HTTP请求、发送HTTP响应都是苦力活,如果我们自己来写这些底层代码,还没开始写动态HTML呢,就得花个把月去读HTTP规范。

正确的做法是底层代码由专门的服务器软件实现,我们用Python专注于生成HTML文档。因为我们不希望接触到TCP连接、HTTP原始请求和响应格式,所以,需要一个统一的接口,让我们专心用Python编写Web业务。

这个接口就是WSGI:Web Server Gateway Interface。

2.MTV模式

Django的MTV模式本质上与MVC模式没有什么差别,也是各组件之间为了保持松耦合关系,只是定义上有些许不同,Django的MTV分别代表:

Model(模型):负责业务对象与数据库的对象(ORM)

Template(模版):负责如何把页面展示给用户

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

此外,Django还有一个url分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template。

3.Django创建流程和命令行工具

(1)创建流程

  略

(2)常用命令行语句:    

<1> 创建一个django工程 : django-admin.py startproject mysite

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

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

<2>在mysite目录下创建blog应用: python manage.py startapp blog

<3>启动django项目:python manage.py runserver 8080

这样我们的django就启动起来了!当我们访问:http://127.0.0.1:8080/时就可以看到:

<4>生成同步数据库的脚本:python manage.py makemigrations

                     同步数据库:  python manage.py migrate

注意:在开发过程中,数据库同步误操作之后,难免会遇到后面不能同步成功的情况,解决这个问题的一个简单粗暴方法是把migrations目录下

的脚本(除__init__.py之外)全部删掉,再把数据库删掉之后创建一个新的数据库,数据库同步操作再重新做一遍。

<5>当我们访问http://127.0.0.1:8080/admin/时,会出现:

所以我们需要为进入这个项目的后台创建超级管理员:python manage.py createsuperuser设置好用户名和密码后便可登录啦!

<6>清空数据库:python manage.py  flush

<7>查询某个命令的详细信息: django-admin.py  help  startapp

admin 是Django 自带的一个后台数据库管理系统。

<8>启动交互界面 :python manage.py  shell

     这个命令和直接运行 python 进入 shell 的区别是:你可以在这个 shell 里面调用当前项目的 models.py 中的 API,对于操作数据,还有一些小测试非常方便。

<9> 终端上输入python manage.py 可以看到详细的列表,在忘记子名称的时候特别有用

 

4.Django的配置文件(settings)

  略

5.Django路由系统(URL)

  URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表;你就是以这种方式告诉Django,对于这个URL调用这个函数,对于那个URL调用那个函数。

1
2
3
urlpatterns = [
    url(正则表达式, views视图函数,参数,别名),
]

参数说明:

    • 一个正则表达式字符串
    • 一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
    • 可选的要传递给视图函数的默认参数(字典形式)
    • 一个可选的name参数

5.1 正则匹配:完全匹配、参数、分组

from django.conf.urls import url
from django.contrib import admin from app01 import views urlpatterns = [ url(r'^articles/2003/$', views.special_case_2003),
#完全匹配(开头固定、结尾固定) #url(r'^articles/[0-9]{4}/$', views.year_archive),
#数字 url(r'^articles/([0-9]{4})/$', views.year_archive),
#参数传递,括号包起来的部分回座位参数传递到视图函数 url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
#分组,?P<year>用于分组,可直接用别名year来调用,()用于传递参数
]

  

5.2 url别名及调用方法

urlpatterns = [
url(r'^index',views.index,name='alex'),
#通过name起别名 ]
========前端调用方法==========
<form action="{% url 'alex' %}" method="post"> 用户名:<input type="text" name="username">
密码:<input type="password" name="password">
<input type="submit" value="submit"> </form>

  

5.3 url映射分发

from django.conf.urls import include, url

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^blog/', include('blog.urls')),
#通过include()来分发,将以blog开头的所有url分发给blog下面的urls.py来处理
]

  

5.4 CBV\FBV

fbv即视图函数对应函数

# 方法一:FBV

urs.py
# url(r'^login.html$', views.login),
---------------------------------------------------
views.py def login(request):
if request.method == "POST":
user = request.POST.get("user")
pwd = request.POST.get("pwd")
c = models.Administrator.objects.filter(username=user,password=pwd).count()
print(c)
if c:
#设置session中存储的数据
request.session["is_login"] = True
request.session["username"] = user
#尤其注意跳转到哪个页面!!!
return render(request,"index.html",{"username":user})
else:
msg = "用户名或密码错误"
return redirect("/login.html",{"msg":msg}) return render(request,"login.html") 

cbv即视图函数对应

#CBV

urs.py

url(r'^login.html$', views.Login.as_view()),#以类的方式进行创建

-----------------vies.py-------------------
from django import views
class Login(views.View):
def get(self,request,*args,**kwargs):
return render(request, "login.html") def post(self,request,*args,**kwargs):
user = request.POST.get("user")
pwd = request.POST.get("pwd")
c = models.Administrator.objects.filter(username=user, password=pwd).count()
print(c)
if c:
#设置session中存储的数据
request.session["is_login"] = True
request.session["username"] = user
#尤其注意跳转到哪个页面!!!
return render(request,"index.html",{"username":user})
else:
msg = "用户名或密码错误"
return redirect("/login.html",{"msg":msg})

 

类中用装饰器

方法一:自定义装饰器

from django import views
from django.utils.decorators import method_decorator#1.引入库
#2.定义装饰器函数
def outer(func):
def inner(request,*args,**kwargs):
print(request.method)
return func(request,*args,**kwargs)
return inner class Login(views.View):
#3.使用装饰器
@method_decorator(outer)
def get(self,request,*args,**kwargs):
return render(request, "login.html")

方法二:自定义dispatch方法,同时继承父类该方法,等同于装饰器

from django import views

class Login(views.View):
#1.先执行自定义的dispatch方法
def dispatch(self, request, *args, **kwargs):
print(11111)
if request.method == "GET":
return HttpResponse("ok") #2.再调用父类中的dispatch方法,dispatch方法类似路由分发
ret = super(Login,self).dispatch(request, *args, **kwargs)
print(22222)
return ret def get(self,request,*args,**kwargs):
return render(request, "login.html") def post(self,request,*args,**kwargs):
user = request.POST.get("user")
pwd = request.POST.get("pwd")
c = models.Administrator.objects.filter(username=user, password=pwd).count()
print(c)
if c:
#设置session中存储的数据
request.session["is_login"] = True
request.session["username"] = user
#尤其注意跳转到哪个页面!!!
return render(request,"index.html",{"username":user})
else:
msg = "用户名或密码错误"
return redirect("/login.html",{"msg":msg})

 

6.Django的视图函数views

1 HttpRequest对象的属性和方法:

path:       请求页面的全路径,不包括域名

method:     请求中使用的HTTP方法的字符串表示。全大写表示。例如
 if  req.method=="GET":

        do_something()
elif req.method=="POST": do_something_else()
GET:         包含所有HTTP GET参数的类字典对象

POST:       包含所有HTTP POST参数的类字典对象服务器收到空的POST请求的情况也是可能发生的,也就是说,表单form通过HTTP POST方法提交请求,但是表单中可能没有数据,
因此不能使用if req.POST来判断是否使用了HTTP POST 方法;应该使用 if req.method=="POST"

2 HttpResponse对象:

对于HttpRequest对象来说,是由django自动创建的,但是,HttpResponse对象就必须我们自己创建。每个view请求处理方法必须返回一个HttpResponse对象。

HttpResponse类在django.http.HttpResponse

在HttpResponse对象上扩展的常用方法:

1
2
3
页面渲染:         render()(推荐)                 render_to_response(),
页面跳转:         redirect("路径")
locals():    可以直接将函数中所有的变量传给模板

3 参数传递及调用

views.py

def login(request):
name=‘mary’
.......... return render(request,"login.html",{‘name’:name})
#传递参数
--------------login.html-----------------
<div>{{name}}</div>
#接收参数

7.模板系统 template

  将页面的设计和Python的代码分离开会更干净简洁更容易维护。 我们可以使用 Django的 模板系统 (Template System)来实现这种模式。

一、模板组成

    组成:HTML代码+逻辑控制代码

二、逻辑控制代码的组成

1.变量:

语法格式:       {{var_name}}

       万能的句点号 来传递索引、属性、键值等

       变量的过滤器(filter)的使用

              语法格式:      {{obj|filter:param}}

2. 标签(tag)的使用(使用大括号和百分比的组合来表示使用tag)

格式:{% tags %}

if语句

{% if %}……{% endif %}

for语句

  {% for %}……{% endfor %}

等等

3 自定义filter和simple_tag

1.新建templatetags文件夹,里面建**.py文件(如tags.py)
2.tags.py中调用装饰器@decorator.simple_tag 来装饰函数(如函数为render_table_row)
3、在settings.py中INSTALLED_APPS中加上该app的名字
4、在**.html文件中,先加载该标签,{% load tags %}
,再调用该函数{% render_table_row 参数1 参数2 %} 也可{% render_table_row 参数1 参数2 as_row %}将结果传递给as_row,通过他来调用结果

4. extend模板继承

参考博客:

http://www.cnblogs.com/yuanchenqi/articles/6083427.html

武sir:ORM、SQLAchemy

http://www.cnblogs.com/wupeiqi/articles/5699254.html

Diango 一——URL的更多相关文章

  1. diango中的url路由系统

    一.url配置 url本质是url与要为该url调用的视图函数之间的映射表 urlpatterns = [正则,视图函数[,别名]] 二.正则表达式 1.匹配原则 django是循环urlpatter ...

  2. diango url的命名和反向解析

    url的命名和反向解析 静态路由 url(r'^login/', views.login,name='login'), 反向解析ht 模板 {% url 'login' %} --> '/app ...

  3. django_视图层_编写url

    URL的配置 django中,url也称urlconf,默认的django项目设定两个url地址,分别是admin站点管理和首页地址.from diango.urls import path,incl ...

  4. Django url分发到工程里

    因为我们建立了Django后 ,url是在mysite下的全局对象 因为我们实际项目里不可能只有一个工程 而全放在全局里去分发url 会让代码耦合度提高,代码量大后会造成维护困难.这时候我们把url分 ...

  5. Django- 反向生成url

    Django中提供了一个关于URL的映射的解决方案, 1.客户端的浏览器发起一个url请求,Django根据URL解析,把url中的参数捕获,调用相应的试图,获取相应的数据,然后返回给客户端显示 2. ...

  6. Diango路由控制

    路由的格式: #路由配置的格式: urls.py里面写 from diango.conf.urls import url urlpatterns = [ url(正则表达式,views视图函数,nam ...

  7. Django入门--url路由基本配置

    URL(Uniform Resoure Locater)统一资源定位符,是对可以从互联网上得到资源位置和访问方法的一种简洁形式,是互联网上标准资源的地址.互联网上的每个文件都有一个唯一的URL,它包含 ...

  8. diango运行流程

    diango运行流程 Django处理一个请求的流程: 在浏览器的地址栏中输入地址,回车,发了一个GET请求 wsgi模块接收了请求,将请求的相关信息封装成request对象 根据地址找到对应函数 执 ...

  9. diango使用顺序

    使用顺序 settings 静态文件配置 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #文件夹根目录 ...

随机推荐

  1. Memcached分布式原理

    http://younglibin.iteye.com/blog/2043761 浅显易懂,值得一读

  2. 《超实用的Node.js代码段》连载二:正确拼接Buffer

    对于初学Node.js框架的开发人员来说,可能认为Buffer模块比较易学.重要性也不是那么突出.其实,Buffer模块在文件I/O和网络I/O中应用非常广泛,其处理二进制的性能比普通字符串性能要高出 ...

  3. VueJs $watch()方法总结!!

    最近公司用vue框架写交互,之前没怎么写过,但是很多数据双向绑定的东东跟angular很像!所以上手很快!哈哈 今天就碰到一个vue的问题啊!!产品需求是,datetimepick时间选择器一更改时间 ...

  4. 使用jQuery发送ajax

    我们先看一下js的原生ajax 直接进入代码,我们先准备好servlet,之后不会改动,所以先看一下. package cn.curry.servlet; import com.alibaba.fas ...

  5. Ubuntu 配置IP地址方法

    接到一客户的服务器,开机已启动发现是Ubuntu系统,当时有点郁闷了,心想没有配置过ubuntu系统,这客户还在旁边了,心里有点紧张了,于是开始上网寻找各种方法配置,最终将IP配置好,给客户上架调试通 ...

  6. github入门之更改提交操作--6

    1.回溯历史版本 1.1.回溯到创建feature-A分支前 1.1.1.要让仓库的HEAD.暂存区.当前工作树回溯到指定状态,需要用到提供目标时间点的哈希值 1.1.2.回溯至未创建feature- ...

  7. MySQL查询优化方法总结

    1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉 ...

  8. 洛谷 P2424 约数和

    题目背景 Smart最近沉迷于对约数的研究中. 题目描述 对于一个数X,函数f(X)表示X所有约数的和.例如:f(6)=1+2+3+6=12.对于一个X,Smart可以很快的算出f(X).现在的问题是 ...

  9. IIS 7.0的根文件(applicationHost.config)位置及说明

    位置 C:\Windows\System32\inetsrv\config\applicationHost.config 说明 https://www.microsoft.com/taiwan/tec ...

  10. [dp]uestc oj E - 菲波拉契数制

    E - 菲波拉契数制 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...