Python全栈开发【Django基础】

Django 特色

强大的数据库功能css

用python的类继承,几行代码就能够拥有一个丰富,动态的数据库操做接口(API),若是须要你也能执行SQL语句html

自带的强大的后台功能前端

几行简单的代码就让你的网站拥有一个强大的后台,轻松管理你的内容!python

优雅的网址jquery

用正则匹配网址,传递到对应函数,随意定义,如你所想!nginx

模板系统web

强大,易扩展的模板系统,设计简易,代码,样式分开设计,更容易管理。正则表达式

缓存系统shell

与memcached或其它的缓存系统联用,更出色的表现,更快的加载速度。数据库

国际化

彻底支持多语言应用,容许你定义翻译的字符,轻松翻译成不一样国家的语言。

Django简介

urls.py

网址入口,关联到对应的views.py中的一个函数(或者generic类),访问网址就对应一个函数。

views.py

处理用户发出的请求,从urls.py中对应过来, 经过渲染templates中的网页能够将显示内容,好比登录后的用户名,用户请求的数据,输出到网页。

models.py

与数据库操做相关,存入或读取数据时用到这个,固然用不到数据库的时候 你能够不使用。

forms.py

表单,用户在浏览器上输入数据提交,对数据的验证工做以及输入框的生成等工做,固然你也能够不使用。

templates 文件夹

views.py 中的函数渲染templates中的Html模板,获得动态内容的网页,固然能够用缓存来提升速度。

admin.py

 

后台,能够用不多量的代码就拥有一个强大的后台。

settings.py

Django 的设置,配置文件,好比 DEBUG 的开关,静态文件的位置等。

Django 基本命令

1. 新建一个 django project

django-admin.py startproject project-name
特别是在 windows 上,若是报错,尝试用 django-admin 代替 django-admin.py 试试

2. 新建 app

一个 project 为一个项目,project-name 项目名称,改为你本身的,要符合Python 的变量命名规则(如下划线或字母开头)

python manage.py startapp app-name
或 django-admin.py startapp app-name

3. 同步数据库

通常一个项目有多个app, 固然通用的app也能够在多个项目中使用。

python manage.py syncdb
 
注意:Django 1.7.1及以上的版本须要用如下命令
python manage.py makemigrations
python manage.py migrate

备注:对已有的 models 进行修改,Django 1.7以前的版本的Django都是没法自动更改表结构的,不过有第三方工具 south,详见 Django 数据库迁移 一节。这种方法能够建立表,当你在models.py中新增了类时,运行它就能够自动在数据库中建立表了,不用手动建立。

4. 使用开发服务器

开发服务器,即开发时使用,通常修改代码后会自动重启,方便调试和开发,可是因为性能问题,建议只用来测试,不要用在生产环境。

python manage.py runserver
 
# 当提示端口被占用的时候,能够用其它端口:
python manage.py runserver 8001
python manage.py runserver 9999
(固然也能够kill掉占用端口的进程)
 
# 监听全部可用 ip (电脑可能有一个或多个内网ip,一个或多个外网ip,即有多个ip地址)
python manage.py runserver 0.0.0.0:8000
# 若是是外网或者局域网电脑上能够用其它电脑查看开发服务器
# 访问对应的 ip加端口,好比 http://172.16.20.2:8000

5. 清空数据库

python manage.py flush

6. 建立超级管理员此命令会询问是 yes 仍是 no, 选择 yes 会把数据所有清空掉,只留下空表。

python manage.py createsuperuser
 
# 按照提示输入用户名和对应的密码就行了邮箱能够留空,用户名和密码必填
 
# 修改 用户密码能够用:
python manage.py changepassword username

7. 导出数据 导入数据

python manage.py dumpdata appname > appname.json
python manage.py loaddata appname.json

关于数据操做 详见:数据导入数据迁移,如今了解有这个用法就能够了。

8. Django 项目环境终端

python manage.py shell

若是你安装了 bpython 或 ipython 会自动用它们的界面,推荐安装 bpython。

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

9. 数据库命令行

python manage.py dbshell

Django 会自动进入在settings.py中设置的数据库,若是是 MySQL 或 postgreSQL,会要求输入数据库用户密码。

在这个终端能够执行数据库的SQL语句。若是您对SQL比较熟悉,可能喜欢这种方式。

10. 更多命令

终端上输入 python manage.py 能够看到详细的列表,在忘记子名称的时候特别有用。

Django的配置文件(settings)

静态文件设置:

1、概述:

     #静态文件交由Web服务器处理,Django自己不处理静态文件。简单的处理逻辑以下(以nginx为例):

     #          URI请求-----> 按照Web服务器里面的配置规则先处理,以nginx为例,主要求配置在nginx.
                             #conf里的location

                         |---------->若是是静态文件,则由nginx直接处理

                         |---------->若是不是则交由Django处理,Django根据urls.py里面的规则进行匹配

    # 以上是部署到Web服务器后的处理方式,为了便于开发,Django提供了在开发环境的对静态文件的处理机制,方法是这样:

    #一、在INSTALLED_APPS里面加入'django.contrib.staticfiles',

    #二、在urls.py里面加入
       if settings.DEBUG:  
           urlpatterns += patterns('', url(r'^media/(?P<path>.*)$', 
           'django.views.static.serve', {'document_root': settings.MEDIA_ROOT }),   
            url(r'^static/(?P<path>.*)$',
          'django.views.static.serve',{'document_root':settings.STATIC_ROOT}), )  

    # 三、这样就能够在开发阶段直接使用静态文件了。

2、MEDIA_ROOT和MEDIA_URL

        #而静态文件的处理又包括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_URL}}abc/a.png">

        #    在部署阶段最大的不一样在于你必须让web服务器来处理media文件,所以你必须在web服务器中配置,
        #  以便能让web服务器能访问media文件
        #    以nginx为例,能够在nginx.conf里面这样:

                 location ~/media/{
                       root/temp/
                       break;
                    }

        #    具体能够参考如何在nginx部署django的资料。

3、STATIC_ROOT和STATIC_URL、
    STATIC主要指的是如css,js,images这样文件,在settings里面能够配置STATIC_ROOT和STATIC_URL,
    配置方式与MEDIA_ROOT是同样的,可是要注意

    #STATIC文件通常保存在如下位置:

    #一、STATIC_ROOT:在settings里面设置,通常用来放一些公共的js,css,images等。

    #二、app的static文件夹,在每一个app所在文夹都可以创建一个static文件夹,而后当运行collectstatic时,
    #    Django会遍历INSTALL_APPS里面全部app的static文件夹,将里面全部的文件复制到STATIC_ROOT。所以,
    #   若是你要创建可复用的app,那么你要将该app所须要的静态文件放在static文件夹中。

    # 也就是说一个项目引用了不少app,那么这个项目所须要的css,images等静态文件是分散在各个app的static文件的,比
    #  较典型的是admin应用。当你要发布时,须要将这些分散的static文件收集到一个地方就是STATIC_ROOT。

    #三、STATIC文件还能够配置STATICFILES_DIRS,指定额外的静态文件存储位置。
    #  STATIC_URL的含义与MEDIA_URL相似。

    # ----------------------------------------------------------------------------
    #注意1:
        #为了后端的更改不会影响前端的引入,避免形成前端大量修改

        STATIC_URL = '/static/'               #引用名
        STATICFILES_DIRS = (
            os.path.join(BASE_DIR,"statics")  #实际名 ,即实际文件夹的名字
        )

        #django对引用名和实际名进行映射,引用时,只能按照引用名来,不能按实际名去找
        #<script src="/statics/jquery-3.1.1.js"></script>
        #------error-----不能直接用,必须用STATIC_URL = '/static/':
        #<script src="/static/jquery-3.1.1.js"></script>

    #注意2(statics文件夹写在不一样的app下,静态文件的调用):

        STATIC_URL = '/static/'

        STATICFILES_DIRS=(
            ('hello',os.path.join(BASE_DIR,"app01","statics")) ,
        )

        #<script src="/static/hello/jquery-1.8.2.min.js"></script>

    #注意3:
        STATIC_URL = '/static/'
        {% load staticfiles %}
       # <script src={% static "jquery-1.8.2.min.js" %}></script>
View Code

其它重要参数设置:

复制代码
APPEND_SLASH
       Default: True
       When set to True, if the request URL does not match any of the patterns in the URLconf and it 
doesn’t end in a slash, an HTTP redirect is issued to the same URL with a slash appended. Note
that the redirect may cause any data submitted in a POST request to be lost.

Django URL (路由系统)

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

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

参数说明:

  • 一个正则表达式字符串
  • 一个可调用对象,一般为一个视图函数或一个指定视图函数路径的字符串
  • 可选的要传递给视图函数的默认参数(字典形式)
  • 一个可选的name参数
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),  #no_named group

    url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),

    url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),

]
#1   There’s no need to add a leading slash, because every URL has that. For
#    example, it’s ^articles, not ^/articles.

#2   A request to /articles/2005/03/ would match the third entry in the list.
#    Django would call the function views.month_archive(request, '2005', '03').

#3   /articles/2005/3/ would not match any URL patterns

#4   /articles/2003/ would match the first pattern in the list, not the second one

#5   /articles/2003/03/03/ would match the final pattern. Django would call the
#    functionviews.article_detail(request, '2003', '03', '03').
View Code

Including other URLconfs

#At any point, your urlpatterns can “include” other URLconf modules. This
#essentially “roots” a set of URLs below other ones.

#For example, here’s an excerpt of the URLconf for the Django website itself.
#It includes a number of other URLconfs:


from django.conf.urls import include, url

urlpatterns = [
   url(r'^admin/', admin.site.urls),
   url(r'^blog/', include('blog.urls')),
]

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
View Code

注意一个经常使用方法:request.POST.getlist('')

2 HttpResponse对象:

  对于HttpRequest对象来讲,是由django自动建立的,可是,HttpResponse对象就必须咱们本身建立。每一个view请求处理方法必须返回一个HttpResponse对象。

  HttpResponse类在django.http.HttpResponse

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

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

 Template基础 (模板语法)

一模版的组成

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

二 逻辑控制代码的组成

1  变量(使用双大括号来引用变量):

语法格式:       {{var_name}}
相关文章
相关标签/搜索