Django 详解<二> 之url和view
Django URL(路由系统)
RL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表;你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码。
urlpatterns = [
url(正则表达式, views视图函数,参数,别名),
]
参数说明:
- 一个正则表达式字符串
- 一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
- 可选的要传递给视图函数的默认参数(字典形式)
- 一个可选的name参数
一、url无名分组之 url参数一
1、 url路由有优先级的
2、 在正则表达式中如果加上括号就是分组了,分组就是一个对象了,就需要一个变量来接收这个对象,这里就是接收写入的url
views文件视图函数
def special_case_2003(req):
return HttpResponse("")
def month_archive(req,y,m):
return HttpResponse(y+"year"+m+"mouth")
urls路由系统无名分组
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r"^cur_time/",views.cur_time),
url(r"^userInfo/",views.userInfo),
、#这个用户连接http://127.0.0.1:8000/articles/2003/ 就能够显示视图函数的内容
url(r'^articles/2003/$', views.special_case_2003),
、# http://127.0.0.1:8000/articles/正则匹配的/正则匹配的/ 就能够显示视图函数
url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
]
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)
然后在views中写入视图函数:
def mouth(req,year,mouth):
return HttpResponse(year+"year"+mouth+"mouth")
这里的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="submit">
</form> </body>
</html>
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=="":
return HttpResponse("登录成功")
return render(req,"login.html")
然后用户输入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 #这里导入include
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r"^app01/",include("app01.urls")),] #分发层级
2、 在app01这个项目功能中创建urls
#!/usr/bin/env python
# -*- coding:utf- -*-
from django.conf.urls import url,include
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r"^new/story/$",views.introduce)
]
3、 在views视图函数中写入
def introduce(req):
return HttpResponse("ok")
用户访问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=123
req.path:/index33
注意一个常用方法: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': '', #你的数据库端口 } }
NAME即数据库的名字,在mysql连接前该数据库必须已经创建,而上面的sqlite数据库下的db.sqlite3则是项目自动创建 USER和PASSWORD分别是数据库的用户名和密码。 设置完后,再启动我们的Django项目前,我们需要激活我们的mysql。 然后,启动项目,会报错:no module named MySQLdb 这是因为django默认你导入的驱动是MySQLdb,可是MySQLdb对于py3有很大问题,所以我们需要的驱动是PyMySQL 所以,我们只需要找到项目名文件下的__init__,在里面写入: import pymysql
pymysql.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 pymysql
pymysql.install_as_MySQLdb() 问题解决!
MOdel连接数据库之后还有更多操作,详情请看下篇
Django 详解<二> 之url和view的更多相关文章
- Android View 的绘制流程之 Layout 和 Draw 过程详解 (二)
View 的绘制系列文章: Android View 的绘制流程之 Measure 过程详解 (一) Android View 绘制流程之 DecorView 与 ViewRootImpl 在上一篇 ...
- Python 19 Django 详解
本节概要 Django详解 前言 有一部分原因是,确实djando的课程有点多:并且,最近又在研究利用python做数据分析时间上耽误了.所以楼主讲所有的课程全部重新观看了一遍,再来撰写博客,其实说起 ...
- PopUpWindow使用详解(二)——进阶及答疑
相关文章:1.<PopUpWindow使用详解(一)——基本使用>2.<PopUpWindow使用详解(二)——进阶及答疑> 上篇为大家基本讲述了有关PopupWindow ...
- Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)
[Android布局学习系列] 1.Android 布局学习之——Layout(布局)详解一 2.Android 布局学习之——Layout(布局)详解二(常见布局和布局参数) 3.And ...
- 爬虫入门之urllib库详解(二)
爬虫入门之urllib库详解(二) 1 urllib模块 urllib模块是一个运用于URL的包 urllib.request用于访问和读取URLS urllib.error包括了所有urllib.r ...
- Shiro 安全框架详解二(概念+权限案例实现)
Shiro 安全框架详解二 总结内容 一.登录认证 二.Shiro 授权 1. 概念 2. 授权流程图 三.基于 ini 的授权认证案例实现 1. 实现原理图 2. 实现代码 2.1 添加 maven ...
- .NET DLL 保护措施详解(二)关于性能的测试
先说结果: 加了缓存的结果与C#原生代码差异不大了 我对三种方式进行了测试: 第一种,每次调用均动态编译 第二种,缓存编译好的对象 第三种,直接调用原生C#代码 .net dll保护系列 ------ ...
- 详解iOS开发之自定义View
iOS开发之自定义View是本文要将介绍的内容,iOS SDK中的View是UIView,我们可以很方便的自定义一个View.创建一个 Window-based Application程序,在其中添加 ...
- logback -- 配置详解 -- 二 -- <appender>
附: logback.xml实例 logback -- 配置详解 -- 一 -- <configuration>及子节点 logback -- 配置详解 -- 二 -- <appen ...
随机推荐
- Java 学习笔记之读取jdbc.propertyes配置参数
package test; import java.io.IOException; import java.io.InputStream; import java.util.Properties; p ...
- javascript对象定义
转载自:http://blog.sina.com.cn/s/blog_75a8cfac0100pif0.html javascript定义对象写法 javascript定义对象的几种简单方法 1.构造 ...
- hdu 1078 FatMouse and Cheese【dp】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1078 题意:每次仅仅能走 横着或竖着的 1~k 个格子.求最多能吃到的奶酪. 代码: #include ...
- linux 文件文件夹操作
文件夹下查询哪些文件含有abc内容: find .|xargs grep -ri "abc"
- 坑爹的 HTTPClient java.lang.NoSuchFieldError: INSTANCE
项目中需要用到httpclient ,maven配置如下 <dependency> <groupId>org.apache.httpcomponents</groupId ...
- <2013 07 06> "极路由" 与 “家庭服务器” 报道两则
跟我做!打造家庭服务器 很久没有更新了,因为之前托朋友帮我弄的mini PC终于到手了.阴差阳错地,原来只打算弄一台将就可用的低功耗下载机,结果到手的却是一台支持1080p(宣称,还没烧过),还带遥控 ...
- ArcGIS for window mobile 数据打开
前言 环境信息:ArcGIS for windows mobile 10.1.1,ArcGIS runtime sdk for windows mobile 10.1.1 一.MapCache的打开 ...
- Server Objects Extension(SOE)开发(一)
1.SOE相关 1.1 什么是SOE SOE(Server对象扩展:Server Object Extenstion),其通过采用ArcObjects的相关的接口.类库对ArcGIS Server的基 ...
- Security Report: Stop using relative path to import CSS files
Detecting and exploiting path-relative stylesheet import (PRSSI) vulnerabilities Early last year G ...
- Nuxt使用iconfont矢量图标
Nuxt可以使用各种前端UI框架,这些框架一般都自带的有一些icon图标可供用户使用,但是一般项目开发的时候,UI框架自带的icon是不能满足实际项目需求的,这个时候我们可以自己找一些图片放到本地项目 ...