首页 > 代码库 > Django <二>

Django <二>

<style></style>

Django URL(路由系统)

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

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

 

参数说明:

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

一、url无名分组之 url参数一

1、  url路由有优先级的

2、  在正则表达式中如果加上括号就是分组了,分组就是一个对象了,就需要一个变量来接收这个对象,这里就是接收写入的url

views文件视图函数

技术分享
def special_case_2003(req):    return HttpResponse("2003")def month_archive(req,y,m):    return HttpResponse(y+"year"+m+"mouth")
View Code

 

urls路由系统无名分组

技术分享
from django.conf.urls import urlfrom django.contrib import adminfrom app01 import  viewsurlpatterns = [    url(r^admin/, admin.site.urls),    url(r"^cur_time/",views.cur_time),    url(r"^userInfo/",views.userInfo),1、#这个用户连接http://127.0.0.1:8000/articles/2003/ 就能够显示视图函数的内容    url(r^articles/2003/$, views.special_case_2003),    2、# http://127.0.0.1:8000/articles/正则匹配的/正则匹配的/  就能够显示视图函数    url(r^articles/([0-9]{4})/([0-9]{2})/$, views.month_archive),]
View Code

 

1、上面用户连接1这个链接,这个是绝对匹配,就会经过视图函数返回2003

2、中的url由于分了两个组,也就相当于对象,所以要在视图函数中用变量来接收这个对象,并且在url中匹配。这里返回给用户输入的连接加上year和mouth

二、url有名分组之 url参数二

The above example used simple, non-named regular-expression groups (via parenthesis) to capture bits of the URL and pass them as positional arguments to a view. In more advanced usage, it’s possible to use named regular-expression groups to capture URL bits and pass them as keyword arguments to a view.

       In Python regular expressions, the syntax for named regular-expression groups is (?P<name>pattern), where name is the name of the group and pattern is some pattern to match.

Here’s the above example URLconf, rewritten to use named groups:

简单说明补充:

re=re.search(‘(?P<id>\d{3})/(?P<name>\w{3})’,’wwee32tt123/ooo’ )

(?P<id>\d{3}  这里就是把这个组命名为id

?P<name>\w{3} 这里就是把这个组命名为name

print(re.group())   #123/ooo

print(re.goup(id))   #123

在urls中写入:

技术分享
url(r"^articles/(?P<year>[0-9]{4})/(?P<mouth>[0-9]{2})/$",views.mouth)
View Code

 

然后在views中写入视图函数:

技术分享
def mouth(req,year,mouth):    return HttpResponse(year+"year"+mouth+"mouth")
View Code

 

这里的year就是匹配的urls中的路径,mouth就是前面url中的路径,这里的year和mouth必须要和urls中的对应

访问http://127.0.0.1:8000/articles/2003/43/

就能在前端出现  2003year43mouth

其实就是把url参数一的对象命名了而已

三、url参数三、

一、在urls中添加第三个参数

url(r"^index",views.index,{"name":"pyrene"})

然后在views中写上视图函数

def index(req,name):    return HttpResponse(name)

 

注意:

这里的视图函数中必须把urls中的第三个参数的key传入到这里面,并且要和urls中的key的名字一模一样

然后访问index页面就会返回给浏览器pyrene

二、如果在urls中的第三个参数前面有分组并且分组的组名和第三个参数的key相同,那么用户访问浏览器的时候就会把覆盖掉分组需要返回来的内容

技术分享
url(r"^index/(?P<name>[0-9]{4})/$",views.index,{"name":"pyrene"})
urls

views视图函数不变

用户访问

http://127.0.0.1:8000/index/2000/

浏览器显示:pyrene 而不是2000

原因是被后面的第三个参数覆盖掉了

应用:

这里的作用可以把几个相同连接,然后加上第三个参数来返回不同的内容

四、url第四个参数

应用:防止修改跳转form路径,造成大量的复杂操作

小知识:

输入form的时候点击tab就会直接把form快捷键出来

urls文件,首先设置别名

url(r"^index/",views.index,name="pyrene")

在templates里面添加login.html文件

技术分享
<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title></head><body>{#<form action="/index/" method="post">#}<form action="{% url "pyrene" %}" method="post">    <input type="text" name="username"/>    <input type="password" name="pwd"/>    <input type="submit" value=http://www.mamicode.com/"submit"></form></body></html>
View Code

 

views视图函数:

技术分享
def index(req):    if req.method=="POST":        username=req.POST.get("username",None)        pwd=req.POST.get("pwd",None)        if username=="aa"and pwd=="123":            return HttpResponse("登录成功")    return render(req,"login.html")
View Code

然后用户输入http://127.0.0.1:8000/index/

输入用户名密码,提交就能登录成功

原因:

1、  首先在urls里面设置了form跳转的别名

2、  在login的前端文件中设置模板语言

3、  然后用户点击提交,前端模板语言就代表了urls的正则匹配的路径,所以能跳转找到views视图函数

参数四的应用:

由于后端测试等需要更改前端与后端的路径名字,所以这里设置别名就不用更改前端的form跳转的路径。避免了复杂操作

url关于别名补充

1、这里的别名是用户连接的时候就已经在后台替换了别名

五、url映射分发

应用背景:

由于一个大型网站有很多个页面,成千上万个,如果把这些页面路由放到全局的urls里面,那样会造成很多麻烦,所以路由映射分发就出现了

思想:

利用分级的方式,首先在全局urls分发器中分别分发给下面不同功能层级进行urls选

用include

1、  在全局urls中操作  导入include,然后分发层级

技术分享
from django.conf.urls import url,include  #这里导入includefrom django.contrib import adminfrom app01 import  viewsurlpatterns = [    url(r^admin/, admin.site.urls),    url(r"^app01/",include("app01.urls")),]   #分发层级
View Code

 

2、 在app01这个项目功能中创建urls

技术分享
#!/usr/bin/env python# -*- coding:utf-8 -*-from django.conf.urls import url,includefrom django.contrib import adminfrom app01 import  viewsurlpatterns = [    url(r"^new/story/$",views.introduce)]
View Code

 

3、  在views视图函数中写入

技术分享
def introduce(req):    return HttpResponse("ok")
View Code

 

用户访问http://127.0.0.1:8000/app01/new/story/

流程:首先在项目全局中设置include、urls分发,然后在下面功能中设置urls连接views视图函数。

Django views(视图函数)

技术分享

http请求中产生两个核心对象:

        http请求:HttpRequest对象

        http响应:HttpResponse对象

所在位置:django.http

之前我们用到的参数request就是HttpRequest    检测方法:isinstance(request,HttpRequest)

1 HttpRequest对象的属性和方法:

技术分享
path:       请求页面的全路径,不包括域名## method:     请求中使用的HTTP方法的字符串表示。全大写表示。例如##                    if  req.method=="GET":##                              do_something()##                    elseif 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"#### COOKIES:     包含所有cookies的标准Python字典对象;keys和values都是字符串。## FILES:      包含所有上传文件的类字典对象;FILES中的每一个Key都是<input type="file" name="" />标签中                     name属性的值,FILES中的每一个value同时也是一个标准的python字典对象,包含下面三个Keys:##             filename:      上传文件名,用字符串表示#             content_type:   上传文件的Content Type#             content:       上传文件的原始内容### user:       是一个django.contrib.auth.models.User对象,代表当前登陆的用户。如果访问用户当前#              没有登陆,user将被初始化为django.contrib.auth.models.AnonymousUser的实例。你#              可以通过user的is_authenticated()方法来辨别用户是否登陆:#              if req.user.is_authenticated();只有激活Django中的AuthenticationMiddleware#              时该属性才可用## session:    唯一可读写的属性,代表当前会话的字典对象;自己有激活Django中的session支持时该属性才可用。#方法get_full_path(),   比如:http://127.0.0.1:8000/index33/?name=123 ,req.get_full_path()得到的结果就是/index33/?name=123req.path:/index33
View Code

注意一个常用方法:request.POST.getlist(‘‘)

2 HttpResponse对象:

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

  HttpResponse类在django.http.HttpResponse

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

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

Django  Models

数据库的配置

1    django默认支持sqlite,mysql, oracle,postgresql数据库。

     <1> sqlite

            django默认使用sqlite的数据库,默认自带sqlite的数据库驱动 , 引擎名称:django.db.backends.sqlite3

     <2> mysql

            引擎名称:django.db.backends.mysql

2    mysql驱动程序

  •    MySQLdb(mysql python)
  •    mysqlclient
  •    MySQL
  •    PyMySQL(纯python的mysql驱动程序)

3     在django的项目中会默认使用sqlite数据库,在settings里有如下设置:

技术分享

如果我们想要更改数据库,需要修改如下:

技术分享

技术分享
DATABASES = {    default: {        ENGINE: django.db.backends.mysql,         NAME: books,    #你的数据库名称        USER: root,   #你的数据库用户名        PASSWORD: ‘‘, #你的数据库密码        HOST: ‘‘, #你的数据库主机,留空默认为localhost        PORT: 3306, #你的数据库端口    }}
View Code

 

 

NAME即数据库的名字,在mysql连接前该数据库必须已经创建,而上面的sqlite数据库下的db.sqlite3则是项目自动创建USER和PASSWORD分别是数据库的用户名和密码。设置完后,再启动我们的Django项目前,我们需要激活我们的mysql。然后,启动项目,会报错:no module named MySQLdb这是因为django默认你导入的驱动是MySQLdb,可是MySQLdb对于py3有很大问题,所以我们需要的驱动是PyMySQL所以,我们只需要找到项目名文件下的__init__,在里面写入:import pymysqlpymysql.install_as_MySQLdb()问题解决!

Django同步mysql操作

一、

技术分享

二、  为了更好的查询修改数据库如下操作:

技术分享

三、然后安装mysql的驱动(driver),点击ok 

技术分享

四、点击输入mysql账号密码,点击more可以查看其它的库文件

技术分享

五、Django项目默认使用sqlite数据库,让其只是mysql需要在项目中的settings中如下设置

首先让支持sqlite的设置注释掉,然后添加上支持mysql的设置# DATABASES = {#     ‘default‘: {#         ‘ENGINE‘: ‘django.db.backends.sqlite3‘,#         ‘NAME‘: os.path.join(BASE_DIR, ‘db.sqlite3‘),#     }# }DATABASES = {    ‘default‘: {        ‘ENGINE‘: ‘django.db.backends.mysql‘,        ‘NAME‘: ‘a1‘,        ‘USER‘:‘root‘,        ‘PASSWORD‘:‘123456‘,        ‘HOST‘:‘‘,        ‘PORT‘:‘3306‘,    }}

注意点:

创建数据库之后注册APP,也就是把“部门”在最后加入,如下“app01”INSTALLED_APPS = [    ‘django.contrib.admin‘,    ‘django.contrib.auth‘,    ‘django.contrib.contenttypes‘,    ‘django.contrib.sessions‘,    ‘django.contrib.messages‘,    ‘django.contrib.staticfiles‘,    ‘app01‘,]

 

说明:

详细解释:DATABASES = {    ‘default‘: {        ‘ENGINE‘: ‘django.db.backends.mysql‘,         ‘NAME‘: ‘books‘,    #你的数据库名称        ‘USER‘: ‘root‘,   #你的数据库用户名        ‘PASSWORD‘: ‘‘, #你的数据库密码        ‘HOST‘: ‘‘, #你的数据库主机,留空默认为localhost        ‘PORT‘: ‘3306‘, #你的数据库端口    }}注意点:NAME即数据库的名字,在mysql连接前该数据库必须已经创建,而上面的sqlite数据库下的db.sqlite3则是项目自动创建USER和PASSWORD分别是数据库的用户名和密码。设置完后,再启动我们的Django项目前,我们需要激活我们的mysql。然后,启动项目,会报错:no module named MySQLdb这是因为django默认你导入的驱动是MySQLdb,可是MySQLdb对于py3有很大问题,所以我们需要的驱动是PyMySQL所以,我们只需要找到项目名文件下的__init__,在里面写入:import pymysqlpymysql.install_as_MySQLdb()问题解决!

 MOdel连接数据库之后还有更多操作,详情请看下篇

 

Django <二>