django小结
一、配置文件
1.media
在上传头像的时候会用到media,首先需要在setting中加下面这一句话
MEDIA_ROOT=os.path.join(BASE_DIR,"blog","media","uploads")
在models中为,语句为avatar = models.FileField(upload_to='avatar')
其中会涉及到几个参数,blog为所在项目的app名,media为上传文件所在的自己建的文件夹,uploads为上传到。。。
url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive), # year_archive(request,year=1990)
客户端的配置(url的分发)需要加上下面两句:
MEDIA_URL="/media/"
url(r'^media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}),
一般情况下上传文件有两种方式:
一种是直接在img标签中写上传路径的url,即
<img src="/media/avatar/a.png">
另外一种是在前端页面进行渲染(模板语法),后面.url
{{current.user.avatar.url}} ------常用
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
''' 静态文件的处理又包括STATIC和MEDIA两类,这往往容易混淆,在Django里面是这样定义的:MEDIA:指用户上传的文件,比如在Model里面的FileFIeld,ImageField上传的文件。如果你定义 MEDIA_ROOT=c:\temp\media,那么File=models.FileField(upload_to="abc/")#,上传的文件就会被保存到c:\temp\media\abc eg: class blog(models.Model): Title=models.charField(max_length=64) Photo=models.ImageField(upload_to="photo") 上传的图片就上传到c:\temp\media\photo,而在模板中要显示该文件,则在这样写 在settings里面设置的MEDIA_ROOT必须是本地路径的绝对路径,一般是这样写: BASE_DIR= os.path.abspath(os.path.dirname(__file__)) MEDIA_ROOT=os.path.join(BASE_DIR,'media/').replace('\\','/') MEDIA_URL是指从浏览器访问时的地址前缀,举个例子: MEDIA_ROOT=c:\temp\media\photo MEDIA_URL="/data/" 在开发阶段,media的处理由django处理: 访问http://localhost/data/abc/a.png就是访问c:\temp\media\photo\abc\a.png 在模板里面这样写<img src="/media/abc/a.png"> 在部署阶段最大的不同在于你必须让web服务器来处理media文件,因此你必须在web服务器中配置, 以便能让web服务器能访问media文件 以nginx为例,可以在nginx.conf里面这样: location ~/media/{ root/temp/ break; } 具体可以参考如何在nginx部署django的资料。 </span><span style="color: #800000;">'''</span></pre>
二、url的配置
在更高级的用法中,可以使用命名的正则表达式组来捕获URL 中的值并以关键字 参数传递给视图。
在Python 正则表达式中,命名正则表达式组的语法是(?P<name>pattern)
,其中name
是组的名称,pattern
是要匹配的模式。
1.有名分组
url(r'^articles/([0-9]{4})/$', views.year_archive), # year_archive(request,1990)
2.无名分组
url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive), # year_archive(request,year=1990)
区别:
有名分组在url路径中后面要写上?以及大写的p,再用一对<>写上自己所定义的名字。
下面是以上URLconf 使用命名组的重写:
from django.conf.urls import urlfrom . import views
urlpatterns = [
url(r'^articles/2003/\(</span><span style="color: #800000;">'</span><span style="color: #000000;">, views.special_case_2003), url(r</span><span style="color: #800000;">'</span><span style="color: #800000;">^articles/(?P<year>[0-9]{4})/\)', views.year_archive),
url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/\(</span><span style="color: #800000;">'</span><span style="color: #000000;">, views.month_archive), url(r</span><span style="color: #800000;">'</span><span style="color: #800000;">^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/\)', views.article_detail),
]
三、反向解析
因为Django奉行的是DRY原则,所以使用这种方式,就无需对url地址进行硬编码.在原本需要硬编码url的地方,直接可以使用url的名字,然后逆向解析出url地址.
Django提供了不同层面上的url解析方法.
- template文件: 用url模板标签
- python代码中可以使用django.core.urlresolvers.reverse()
- 其他get_absolute_url()
1.url的反向解析
URL request -> view calling
view calling -> URL request
2.in template(模板反向解析):
3.in views(视图函数反向解析)
例子:
考虑下面的URLconf:
from django.conf.urls import urlfrom . import views
urlpatterns = [
#...
url(r'^articles/([0-9]{4})/$', views.year_archive, name='news-year-archive'),
#...
]
根据这里的设计,某一年nnnn对应的归档的URL是/articles/nnnn/
。
你可以在模板的代码中使用下面的方法获得它们:
<a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a><ul>
{% for yearvar in year_list %}
<li><a href="{% url 'news-year-archive' yearvar %}">{{ yearvar }} Archive</a></li>
{% endfor %}
</ul>
在Python 代码中,这样使用:
from django.core.urlresolvers import reverse from django.http import HttpResponseRedirectdef redirect_to_year(request):
# ...
year = 2006
# ...
return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))
四、视图函数
HttpResponse对象属性总结:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
属性:
django将请求报文中的请求行、首部信息、内容主体封装成 HttpRequest 类中的属性。
除了特殊说明的之外,其他均为只读的。
'''
1.HttpRequest.body
一个字符串,代表请求报文的主体。在处理非 HTTP 形式的报文时非常有用,例如:二进制图片、XML,Json等。
但是,如果要处理表单数据的时候,推荐还是使用 HttpRequest.POST 。
另外,我们还可以用 python 的类文件方法去操作它,详情参考 HttpRequest.read() 。
2.HttpRequest.path
一个字符串,表示请求的路径组件(不含域名)。
例如:"/music/bands/the_beatles/"
3.HttpRequest.method
一个字符串,表示请求使用的HTTP 方法。必须使用大写。
例如:"GET"、"POST"
4.HttpRequest.encoding
一个字符串,表示提交的数据的编码方式(如果为 None 则表示使用 DEFAULT_CHARSET 的设置,默认为 'utf-8')。
这个属性是可写的,你可以修改它来修改访问表单数据使用的编码。
接下来对属性的任何访问(例如从 GET 或 POST 中读取数据)将使用新的 encoding 值。
如果你知道表单数据的编码不是 DEFAULT_CHARSET ,则使用它。
5.HttpRequest.GET
一个类似于字典的对象,包含 HTTP GET 的所有参数。详情请参考 QueryDict 对象。
6.HttpRequest.POST
一个类似于字典的对象,如果请求中包含表单数据,则将这些数据封装成 QueryDict 对象。
POST 请求可以带有空的 POST 字典 —— 如果通过 HTTP POST 方法发送一个表单,但是表单中没有任何的数据,QueryDict 对象依然会被创建。
因此,不应该使用 if request.POST 来检查使用的是否是POST 方法;应该使用 if request.method == "POST"
另外:如果使用 POST 上传文件的话,文件信息将包含在 FILES 属性中。
7.HttpRequest.REQUEST
一个类似于字典的对象,它首先搜索POST,然后搜索GET,主要是为了方便。灵感来自于PHP 的 $_REQUEST。
例如,如果 GET = {"name": "john"} 而 POST = {"age": '34'} , REQUEST["name"] 将等于"john", REQUEST["age"] 将等于"34"。
强烈建议使用 GET 和 POST 而不要用REQUEST,因为它们更加明确。
8.HttpRequest.COOKIES
一个标准的Python 字典,包含所有的cookie。键和值都为字符串。
9.HttpRequest.FILES
一个类似于字典的对象,包含所有的上传文件信息。
FILES 中的每个键为<input type="file" name="" /> 中的name,值则为对应的数据。
注意,FILES 只有在请求的方法为POST 且提交的<form> 带有enctype="multipart/form-data" 的情况下才会
包含数据。否则,FILES 将为一个空的类似于字典的对象。
10.HttpRequest.META
一个标准的Python 字典,包含所有的HTTP 首部。具体的头部信息取决于客户端和服务器,下面是一些示例:
CONTENT_LENGTH —— 请求的正文的长度(是一个字符串)。
CONTENT_TYPE —— 请求的正文的MIME 类型。
HTTP_ACCEPT —— 响应可接收的Content-Type。
HTTP_ACCEPT_ENCODING —— 响应可接收的编码。
HTTP_ACCEPT_LANGUAGE —— 响应可接收的语言。
HTTP_HOST —— 客服端发送的HTTP Host 头部。
HTTP_REFERER —— Referring 页面。
HTTP_USER_AGENT —— 客户端的user-agent 字符串。
QUERY_STRING —— 单个字符串形式的查询字符串(未解析过的形式)。
REMOTE_ADDR —— 客户端的IP 地址。
REMOTE_HOST —— 客户端的主机名。
REMOTE_USER —— 服务器认证后的用户。
REQUEST_METHOD —— 一个字符串,例如"GET" 或"POST"。
SERVER_NAME —— 服务器的主机名。
SERVER_PORT —— 服务器的端口(是一个字符串)。
从上面可以看到,除 CONTENT_LENGTH 和 CONTENT_TYPE 之外,请求中的任何 HTTP 首部转换为 META 的键时,
都会将所有字母大写并将连接符替换为下划线最后加上 HTTP_ 前缀。
所以,一个叫做 X-Bender 的头部将转换成 META 中的 HTTP_X_BENDER 键。
11.HttpRequest.user
一个 AUTH_USER_MODEL 类型的对象,表示当前登录的用户。
如果用户当前没有登录,user 将设置为 django.contrib.auth.models.AnonymousUser 的一个实例。你可以通过 is_authenticated() 区分它们。
例如:
if request.user.is_authenticated():
# Do something for logged-in users.
else:
# Do something for anonymous users.
user 只有当Django 启用 AuthenticationMiddleware 中间件时才可用。
-------------------------------------------------------------------------------------
匿名用户
class models.AnonymousUser
django.contrib.auth.models.AnonymousUser 类实现了django.contrib.auth.models.User 接口,但具有下面几个不同点:
id 永远为None。
username 永远为空字符串。
get_username() 永远返回空字符串。
is_staff 和 is_superuser 永远为False。
is_active 永远为 False。
groups 和 user_permissions 永远为空。
is_anonymous() 返回True 而不是False。
is_authenticated() 返回False 而不是True。
set_password()、check_password()、save() 和delete() 引发 NotImplementedError。
New in Django 1.8:
新增 AnonymousUser.get_username() 以更好地模拟 django.contrib.auth.models.User。
12.HttpRequest.session
一个既可读又可写的类似于字典的对象,表示当前的会话。只有当Django 启用会话的支持时才可用。
完整的细节参见会话的文档。
13.HttpRequest.resolver_match
一个 ResolverMatch 的实例,表示解析后的URL。这个属性只有在 URL 解析方法之后才设置,这意味着它在所有的视图中可以访问,
但是在 URL 解析发生之前执行的中间件方法中不可以访问(比如process_request,但你可以使用 process_view 代替)。
'''
响应对象-----response:
return HttpResponse("") # 返回字符串实例
return render(request,"template",{"":""}) # 返回字符串实例 (**********)
return redirect("/index/") # 重定向 (**********) 实质上发送了两次请求
五、模板语言
view.py
1 2 3 4 5 | def foo(): name = "yuan" l = [ 111 , 222 , 333 ] d = { "info" :[obj1,obj2]} returnr render(request, "index.html" , locals ()) |
1.变量{{name}}
---深度查询 句点符 {{l.0}} {{d.info.0.name}}
----过滤器:{{name|date:"Y-m-d"}}
2.标签
{%for i in l%} {{i}}{</span>%empty%<span style="color: #000000;">} </span><p>没有符合条件的书籍</p><span style="color: #000000;"> {</span>%endfor%<span style="color: #000000;">} </span>--------<span style="color: #000000;"> {</span>%<span style="color: #0000ff;">if</span> name == <span style="color: #800000;">"</span><span style="color: #800000;">yuan</span><span style="color: #800000;">"</span>%<span style="color: #000000;">} </span><p>真帅</p><span style="color: #000000;"> {</span>%<span style="color: #0000ff;">elif</span> ...%<span style="color: #000000;">} {</span>%endif%<span style="color: #000000;">} </span></pre>
3.模板继承
(1) base.html : {%block con%}{%end block con%} (2) index.html: {% extends "base.html"%} 继承 {%block con%} {{block.super}} 模板盒子中内容 {%end block con%} 覆盖
六、model模型(ORM)
映射关系:
sql中表名--------------python的类名
sql中表的字段----------python的类属性
sql中表的记录----------python的类对象