首页 > 代码库 > Djiango框架秘籍

Djiango框架秘籍

Python的WEB框架有Django、Tornado、Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM、模型绑定、模板引擎、缓存、Session等诸多功能。

基本配置

一、创建django程序

  • 终端命令:django-admin startproject sitename   在终端创建目录
  • cd mysite
  • python manage.py starapp app01  创建一个app
  • IDE创建Django程序时,本质上都是自动执行上述命令

其他常用命令:

  python manage.py runserver 0.0.0.0   

  python manage.py startapp appname   

  python manage.py syncdb   

  python manage.py makemigrations   

  python manage.py migrate

  python manage.py createsuperuser

二、程序目录

技术分享

三、配置文件

1、数据库

DATABASES = {
    default: {
    ENGINE: django.db.backends.mysql,
    NAME:dbname,
    USER: root,
    PASSWORD: xxx,
    HOST: ‘‘,
    PORT: ‘‘,
    }
}

 

由于Django内部连接MySQL时使用的是MySQLdb模块,而python3中还无此模块,所以需要使用pymysql来代替 

# 如下设置放置的与project同名的配置的 __init__.py文件中  

import pymysql
pymysql.install_as_MySQLdb() 

2、模版

TEMPLATE_DIRS = (
        os.path.join(BASE_DIR,templates),
    )

3、静态文件

STATICFILES_DIRS = (
        os.path.join(BASE_DIR,static),
    )

路由系统

1、单一路由对应

url(r^index$, views.index),

2、基于正则的路由

url(r^index/(\d*), views.index),
url(r^manage/(?P<name>\w*)/(?P<id>\d*), views.manage),

3、添加额外的参数

url(r^manage/(?P<name>\w*), views.manage,{id:333}),

4、为路由映射设置名称

url(r^home, views.home, name=h1),
url(r^index/(\d*), views.index, name=h2),

设置名称之后,可以在不同的地方调用,如:

  • 模板中使用生成URL     {% url ‘h2‘ 2012 %}
  • 函数中使用生成URL     reverse(‘h2‘, args=(2012,))      路径:django.urls.reverse
  • Model中使用获取URL  自定义get_absolute_url() 方法
class NewType(models.Model):
    caption = models.CharField(max_length=16)


    def get_absolute_url(self):
        """
        为每个对象生成一个URL
        应用:在对象列表中生成查看详细的URL,使用此方法即可!!!
        :return:
        """
        # return /%s/%s % (self._meta.db_table, self.id)
        # 或
        from django.urls import reverse
        return reverse(NewType.Detail, kwargs={nid: self.id})

获取请求匹配成功的URL信息:request.resolver_match

5、根据app对路由规则进行分类  

url(r^web/,include(web.urls)),

6、命名空间

a. project.urls.py

from django.conf.urls import url,include 

urlpatterns = [
    url(r^a/, include(app01.urls, namespace=author-polls)),
    url(r^b/, include(app01.urls, namespace=publisher-polls)),
]

b. app01.urls.py

from django.conf.urls import url
from app01 import views 

app_name = app01
urlpatterns = [
    url(r^(?P<pk>\d+)/$, views.detail, name=detail)
]

c. app01.views.py

def detail(request, pk):
    print(request.resolver_match)
    return HttpResponse(pk)

以上定义带命名空间的url之后,使用name生成URL时候,应该如下:

  • v = reverse(‘app01:detail‘, kwargs={‘pk‘:11})
  • {% url ‘app01:detail‘ pk=12 pp=99 %}

django中的路由系统和其他语言的框架有所不同,在django中每一个请求的url都要有一条路由映射,这样才能将请求交给对一个的view中的函数去处理。其他大部分的Web框架则是对一类的url请求做一条路由映射,从而是路由系统变得简洁。

通过反射机制,为django开发一套动态的路由系统Demo: 点击下载

 

Django目录介绍、路由系统、 ORM操作

Django目录介绍
        django-admin startproject mysite  在终端创建目录
        cd mysite
        python manage.py starapp app01    创建一个app 
        
        project
            - app01
                -migrations  和数据库相关,和modal相关
                - admin   Django自带后台管理相关配置
                - modal   写类,根据类创建数据库表
                - test    单元测试
                - views   业务处理,业务可以分类
            - app02
            - app03

    1. 路由系统(位置参数和形式参数不要不要混用,*args,**kwargs可以接收参数)
        url -> 函数
        
        a. /login/ -> def login        SEO权重不高
        
        b. /add-user/(\d+)/  ->  def add_user(request,a1)
           /add-user/(\d+)/(\d+)/ ->  def add_user(request,a1,a2)    位置参数
        
        c. /add-user/(?P<a1>\d+)/  ->  def add_user(request,a1)        形式参数
        
        url(r^index/, views.index),   访问时必须index/这种形式
        url(r^index$, views.index),   访问时必须index这种形式
        url(r^index, views.index),     访问时index开头的任意字符串都可以访问
        url(r^index/(\d+).html, views.index),   访问时必须index/(\d+).html开头的这种形式
        url(r^, views.index)            没有匹配成功,设置默认html
        PS: 
            终止符:
                ^edit$
            伪静态    提高SEO权重
                url(r^edit/(\w+).html$, views.edit),
        d. 路由分发
            urls.py中
            导入from django.conf.urls import include
                url(r^app01/, include(app01.urls)),
                
                先在总路由匹配app路径,然后去该app下urls.py中去匹配路径
                
            
            app01.urls.py
                url(r^index.html$, views.index),
                
        e. 路由系统之别名反向生成url            
            
            根据名称可以反向生成URL
            1. url(r^index/, views.index,name="n1)
            在Python代码中,在viws.py中
            def index(request):
                from django.urls import reverse
                v = reverse(n1)
                print(v)    #生成url路径/index/
                
                
             url(r^index/(\d+)/, views.index,name="n1)
            在Python代码中,在viws.py中
            def index(request,a1):
                from django.urls import reverse
                v = reverse(n1,args={451})
                print(v)    #生成url路径/index/451/
                        
             url(r^index/(?P<a1>\d+)/, views.index,name="n1)
            在Python代码中,在viws.py中
            def index(request,a1):
                from django.urls import reverse
                v = reverse(n1,kwargs={a1:1111})
                print(v)    #生成url路径/index/1111/
            
            2. 在路由文件中
                url(r^login/, views.login,name=m1)
                在html文件中
                {% url "m1" %} 提交就可以找到/login/路径
                
                在路由文件中
                url(r^login/(\W)/, views.login,name=m1)
                url(r^login/(\W).html$, views.login,name=m1)
                在html文件中
                {% for i in user_list %}
                    <li>{{ i }}|<a href=http://www.mamicode.com/"{% url "m1" i %}">编辑</a></li>
                {% endfor %}
                提交就可以找到/login/i路径
                提交就可以找到/login/i.html路径
                
                
            
    3. ORM操作
        ORM利用pymysql第三方工具连接数据库
        默认:使用SQLlite 数据库
        Http请求:
            url -> 视图(模板+数据)
        步骤:
            1. 创建数据库:在数据库创建70db
            2. 在settings中设置
                # DATABASES = {
                #     default: {
                #         ENGINE: django.db.backends.sqlite3,
                #         NAME: os.path.join(BASE_DIR, db.sqlite3),
                #     }
                # }

                DATABASES = {
                    default: {
                        ENGINE: django.db.backends.mysql,
                        NAME:70db,
                        USER: root,
                        PASSWORD: ‘‘,
                        HOST: localhost,
                        PORT: 3306,
                        }
                }
        3. 在项目__init__.py中更换默认连接数据库的方式,MySQLDB(修改django默认连接mySQL方式)
            import pymysql
            pymysql.install_as_MySQLdb()
    
    
        4.在app下的models.py下:创建表
        from django.db import models
        
        class user_group(models.Model):
            title = models.CharField(max_length=32)

        class user_info(models.Model):
            id = models.BigAutoField(primary_key=True)   #这一列不写也会自动生成
            username=models.CharField(max_length=32)
            password=models.CharField(max_length=64)
            # age = models.IntegerField(null=True)  #设置可以为空,创建表后插入这一列时可以这么设置
            age = models.IntegerField(default=1)
            #默认生成ug_id,设置可以为空,创建表后插入这一列时可以这么设置
            ug = models.ForeignKey("user_group",null=True)
            

        
        5.在配置中注册app
        INSTALLED_APPS = [
            django.contrib.admin,
            django.contrib.auth,
            django.contrib.contenttypes,
            django.contrib.sessions,
            django.contrib.messages, 
            django.contrib.staticfiles,
            app01
        ]
        
        6.创建数据表
            命令:
            python manage.py makemigrations
            python manage.py migrate
        
        ORM操作表:
            创建表
            修改表
            删除表
        操作数据行:
            增删改查
            基于ORM实现组表操作
            #新增
            # models.user_group.objects.create(title="销售部")
            # models.user_info.objects.create(user=root,password=pwd,age=18,ug_id=1)
            # 查找
            # group_list = models.user_group.objects.all()
            # group_list = models.user_group.objects.filter(id=1)
            # group_list = models.user_group.objects.filter(id__gt=1)   #大于
            # group_list = models.user_group.objects.filter(id__lt=1)   #小于

            # print(group_list)   #group_list是QuerySet类型,可以看成列表
            # group_list QuerySet类型(列表)
            # QuerySet类型[obj,obj,obj]
            # for row in group_list:
            #     print(row.id,row.title)
            # models.user_info.objects.all()

            # 删除
            # models.user_group.objects.filter(id=2).delete()

            # 更新
            # models.user_group.objects.filter(id=2).update(title=公关部)
            
            基于ORM实现员工表操作
                1.增加

                    models.UserInfo.objects.create(user=root,password=123,age=10,ug_id=1)

                    obj = models.UserGroup.objects.filter(id=1).first()
                    models.UserInfo.objects.create(user=root,password=123,age=10,ug=obj)

                2. 删除:
                    models.UserInfo.objects.filter(id=2).delete()

                3. 修改:
                    models.UserInfo.objects.filter(id=2).update(title=公关部)

                4. 查询:
                    group_list = models.UserInfo.objects.all()
                    group_list获取的是QuerySet,内部元素是UserInfo对象,每一个对象代指一行数据,
                    对象中如果包含ForeignKey,则代指与其关联表的一行数据

                    for row in group_list:
                        print(row.user)
                        print(row.age)
                        print(row.ug_id)    # 用户信息关联的部门ID
                        print(row.ug.title) # 用户信息关联的部门名称

 

Djiango框架秘籍