Django day004

路由系统(URL)

因匹配关系从上到下依次匹配,建议匹配关系末尾使用"$",避免前面相同,而匹配出错

  1. 一对一

    • url(r‘^home‘, views.Home.as_view()) 对应类
    • url(r‘^detail‘, views.detail) 对应函数
  2. 一对多
    • url(r‘^detail-(\d+).html‘, views.detail),
    • url(r‘^detail-(\d+)-(\d+).html‘, views.detail) 形参位置顺序影响业务逻辑
    • url(r‘^detail-(?P\d+)-(?P\d+).html‘, views.detail) 推荐
  3. 使用方法
     def detail(request, *args, **kwargs):
     	# kwargs 以字典形式取值
     	detail_info = USER_DICT.get(kwargs.get("nid"))
     	# args 以元组形式取值
     	detail_info = USER_DICT.get(args[0])
    
     def detail(request, nid, uid):
     	detail_info = USER_DICT.get(nid)
    
  4. name 路由对应名称

    对URL路径关系进行命名,以后可以根据此名称生成自己想要的URL

     通常情况(WEB框架通用方法)
     	url对应关系名称修改,html的form标签中action内容对应修改
     	例如:
     		url(r‘^indexddhhddjdfjd‘, views.index),
     		<form action="/indexddhhddjdfjd" method="post">
    
     django特有方法
     	(1) 仅需要修改url对应关系即可,无需修改html
     		例如:
     			url(r‘^bjbjbj‘, views.index, name="index"),
     			<form action="{% url ‘index‘ %}" method="post">
     			def index(request): pass
     		缺点:仅能访问http://127.0.0.1:8000/bjbjbj/
     			但http://127.0.0.1:8000/bjbjbj/1/就访问失败
    
     	(2)支持访问http://127.0.0.1:8000/bjbjbj/5/1
     		url(r‘^bjbjbj/(\d+)/(\d+)‘, views.index, name="index"),
     		<form action="{% url ‘index‘ 1 2 %}" method="post">
     		def index(request, nid, uid): pass
     		缺点:访问的是http://127.0.0.1:8000/bjbjbj/5/1,
     			但生成的是<form action="/bjbjbj/1/2" method="post">
    
     	(3)访问和生成一致
     		url(r‘^bjbjbj/(\d+)/(\d+)‘, views.index, name="index"),
     		<form action={{ request.path_info }} method="post">
     		def index(request, nid, uid): pass
    
     	(4)也可以在views.py中生成
     		url(r‘^bjbjbj‘, views.index, name="index"),
     		<form action={{ request.path_info }} method="post">
     		def index(request):
     		    from django.urls import reverse
     		    v = reverse("index")
     		    print(v)
     		    return render(request, ‘index.html‘, {"user_dict": USER_DICT})
    
     		url(r‘^bjbjbj/(\d+)/(\d+)‘, views.index, name="index"),
     		<form action={{ request.path_info }} method="post">
     		def index(request, nid, uid):
     		    from django.urls import reverse
     		    v = reverse("index", args=(1, 2))
     		    print(v)
     		    return render(request, ‘index.html‘, {"user_dict": USER_DICT})
    
     		url(r‘^bjbjbj/(?P<nid>\d+)/(?P<uid>\d+)‘, views.index, name="index"),
     		<form action={{ request.path_info }} method="post">
     		或者<form action="{% url ‘index‘ nid=1 uid=3 %}" method="post">
     		def index(request, nid, uid):
     		    from django.urls import reverse
     		    v = reverse("index", kwargs={"nid":nid, "uid":uid})
     		    print(v)
     		    return render(request, ‘index.html‘, {"user_dict": USER_DICT})
    
     总结:
     	{{ request.path_info }} 当前的url,操作后,还在当前操作页
     	{% url "index" 3 6 %} 在当前页操作,操作后,跳转到指定页,定制
    
     	url(r‘^fine/‘, views.index, name="i1"),
     	url(r‘^today/(\d+)/(\d+)‘, views.index, name="i2"),
     	url(r‘^buy/(?P<nid>\d+)/(?P<uid>\d+)‘, views.index, name="i3"),
    
     	def func(request, *args, **kwargs):
     		from django.urls import reverse
    
     		url1 = reverse("i1")							# fine/
     		url2 = reverse("i2", args=(1,2,))				# yug/1/2/
     		url3 = reverse("i3", kwargs={"pid":1, "nid":9}) # buy/1/9/
    
     	xxx.html
     		{% url "i1" %}				# fine/
     		{% url "i2" 1 2 %}			# yug/1/2/
     		{% url "i3" pid=1 nid=9 %}	# buy/1/9/
    
  5. 路由分发 工程 urls.py 写分类
     from django.conf.urls import include
    
     urlpatterns = [
         url(r‘^cmdb/‘, include("app01.urls")),
         url(r‘^monitor/‘, include("app02.urls")),
     ]
    

    app02之urls.py 写app02的具体路由对应关系

     from django.conf.urls import url
    
     from app02 import views
    
     urlpatterns = [
         url(r‘^login‘, views.login),
     ]
    

    app01之urls.py 写app01的具体路由对应关系

     同app02的url.py,和之前的写法一样
    

    客户端访问方式改为

     http://127.0.0.1:8000/cmdb/login
     http://127.0.0.1:8000/monitor/login
    
注:路由分发"进"(客户端请求)起作用,但"出"(发回客户端)需要明确表明
html要修改
	<form action="/monitor/login" method="post">
或者app的views.py中
	return redirect(‘/monitor/index1‘)
  1. 默认值
  2. 命名空间

客户端访问形式一:http://127.0.0.1:8000/detail?nid=2

默认页面是动态的

urls.py
	url(r‘^detail‘, views.detail),
	url(r‘^login‘, views.login),

views.py
	USER_DICT={
	    "1":{"name": "root1", "email": "[email protected]"},
	    "2":{"name": "root2", "email": "[email protected]"},
	    "3":{"name": "root3", "email": "[email protected]"},
	    "4":{"name": "root4", "email": "[email protected]"},
	}

	def detail(request):
	    nid = request.GET.get("nid")
	    detail_info = USER_DICT.get(nid)
	    return render(request, "detail.html", 	{"detail_info":detail_info})

	def index(request):
		return render(request, ‘index.html‘, {"user_dict": USER_DICT})

index.html
	<ul>
        {% for k, v in user_dict.items %}
            <li><a target="_blank" href="/detail?nid={{ k }}">{{ v.name }}</a></li>
        {% endfor %}
    </ul>

detail.html
	<body>
	    <h1>详细信息</h1>
	    <h6>用户名:{{ detail_info.name }}</h6>
	    <h6>邮箱:{{ detail_info.email }}</h6>
	</body>

客户端访问形式二:http://127.0.0.1:8000/detail-1-10.html

默认页面是静态的

views.py
	这里要求与urls对应关系的参数个数一致
	def detail(request, nid, uid):
	    detail_info = USER_DICT.get(nid)
	    return render(request, "detail.html", {"detail_info": detail_info})

	若参数不确定时,可以写成
	def detail(request, *args, **kwargs):
		pass

urls.py
	url(r‘^detail-(?P<nid>\d+)-(?P<uid>\d+).html‘, views.detail)

index.html
	<ul>
        {% for k, v in user_dict.items %}
            <li><a target="_blank" href="/detail-{{ k }}.html">{{ v.name }}</a></li>
        {% endfor %}
	</ul>	

detail.html 同上

视图

	request.GET
	request.POST
	request.FILES(文件操作)

	FBV function base view
		urls.py
			index -> 函数名
			url(r‘^login‘, views.login),
			请求来了,执行函数名对应的方法

		views.py
			def func(request):
				pass

	CBV	class base view
		urls.py
			home -> 类
			url(r‘^home‘, views.Home.as_view()),
				注:as_view()为固定写法
			请求来了,执行类中具体的方法

		views.py
			from django.views import View

			class Home(View):
			    def dispatch(self, request, *args, **kwargs):
			        print("before")
			        result = super(Home, self).dispatch(request, *args, **kwargs)
			        print("after")
			        return result

			    def get(self, request):
			        print(request.method)
			        return render(request, ‘home.html‘)

			    def post(self, request):
			        print(request.method)
			        return render(request, ‘home.html‘)

	装饰器

默认数据交互规则

  • GET: 获取数据

    • 浏览器默认方法
    • 将输入的内容,填充到url中,url上内看到填写内容,再发放到服务端
  • POST:提交数据
    • 将输入内容,填充到body中,再发放到服务端
  • GET方法和POST方法
    • get方法和post方法传输的内容,都可以通过抓包方式,获取内容
    • 不存在,那种方式更安全之说。
  • PUT
  • DELETE
  • HEAD
  • OPTION

获取用户提交信息

  • 输入框

    • request.POST.get("username")
  • 单选框
    • request.POST.get("gender")
  • 多选框
    • request.POST.getlist("favor")
  • select
    • 默认单选

      • request.POST.get("city")
    • 有multiple,可多选
      • request.POST.getlist("city")
  • 文件 form 表单头需要添加 enctype="multipart/form-data"
    • 文件名

      • obj.name
    • 文件内容(上传文件)
      obj = request.FILES.get("file")
      print(type(obj.name), obj.name)
      file_path = os.path.join("upload", obj.name)
      with open(file_path, mode="wb") as f:
          for part in obj.chunks():
              f.write(part)
    

原文地址:https://www.cnblogs.com/todayisafineday/p/8111708.html

时间: 2024-08-30 15:12:15

Django day004的相关文章

Django url 标签和reverse()函数的使用(转)

原文:http://www.yihaomen.com/article/python/355.htm 使用url标签和reverse()函数,可以避免在模板和view中对url进行硬编码,这样即使url改变了,对模板和view也没有影响 起初用django 开发应用的时候,完全是在urls.py 中硬编码配置地址,在views.py中HttpResponseRedirect()也是硬编码转向地址,当然在template 中也是一样了,这样带来一个问题,如果在urls.py 中修改了某个页面的地址,

利用 Django REST framework 编写 RESTful API

利用 Django REST framework 编写 RESTful API Updateat 2015/12/3: 增加 filter 最近在玩 Django,不得不说 rest_framework 真乃一大神器,可以轻易的甚至自动化的搞定很多事情,比如: 自动生成符合 RESTful 规范的 API 支持 OPTION.HEAD.POST.GET.PATCH.PUT.DELETE 根据 Content-Type 来动态的返回数据类型(如 text.json) 生成 browserable

Django(三) ORM 数据库操作

比较有用 转自 http://blog.csdn.net/fgf00/article/details/53678205 一.DjangoORM 创建基本类型及生成数据库表结构 1.简介 2.创建数据库 表结构 二.Django ORM基本增删改查 1.表数据增删改查 2.表结构修改 三.Django ORM 字段类型 1.字段类型介绍 2.字段参数介绍 3.Django ORM 外键操作 一.DjangoORM 创建基本类型及生成数据库表结构 1.简介 ORM:关系对象映射.定义一个类自动生成数

linux中部署django项目

通过Nginx部署Django(基于ubuntu) Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式. 在这种方式中,我们的通常做法是,将nginx作为服务器最前端,它将接收WEB的所有请求,统一管理请求.nginx把所有静态请求自己来处理(这是NGINX的强项).然后,NGINX将所有非静态请求通过uwsgi传递给Django,由Django来进行处理,从而完成一次WEB请求. 可见,uwsgi的作用就类似一个桥接器.起到桥梁的作用. Linux的强项

【前端框架】Django补充

一.缓存 由于Django是动态网站,所以每次请求均会去取到数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单的解决方式就是使用缓存,缓存将某个views返回的值保存至内存或者memcache中,5分钟内再有人来访问时,则不再去执行view中的操作,而是直接从内存或者redis中把之前缓存的内容拿到,并返回. Django中提供了6中缓存方式: 开发调试 内存 文件 数据库 Memcache缓存(python-memcached模块) Memcache缓存(pylibmc模块) 1

Django之Form组件

Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1.创建Form类 from django.forms import Form from django.forms import widgets from django.forms import fields class MyForm(Form): user = fields.CharField( widget=widgets.Tex

Django表单上传

任务描述:实现表单提交(上传文件) 1.项目目录: 2.源代码: regist.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>regist</title> </head> <body> <h3>regist</h3> <hr> <

Django之ModelForm组件

1.Django之ModelForm组件 ModelForm a. class Meta: model, # 对应Model的 fields=None, # 字段 exclude=None, # 排除字段 labels=None, # 提示信息 help_texts=None, # 帮助提示信息 widgets=None, # 自定义插件 error_messages=None, # 自定义错误信息(整体错误信息from django.core.exceptions import NON_FIE

win7 32位配置apache+wsgi+django环境

1下载xampp,里面有apache,mysql,phpmyadmin, 2 下载wsgi,http://download.csdn.net/download/copter/9192361 将对应的模块解压放到D:\programs\xampp\apache\modules 然后到D:\programs\xampp\apache\conf\httpd.conf中 # 添加mod_wsgi.so 模块LoadModule wsgi_module modules/mod_wsgi.so # Virt