首页 > 其他 > 详细

Djiango框架秘籍

时间:2017-06-25 18:18:25      阅读:1817      评论:0      收藏:0      [点我收藏+]

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="{% 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框架秘籍

原文:http://www.cnblogs.com/domestique/p/7077279.html

踩
(0)
赞
(0)
   
举报
评论 一句话评论(0)
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!